{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sklearn 数据预处理  \n",
    "https://blog.csdn.net/qq_40195360/article/details/88378248  \n",
    "http://scikitlearn.com.cn/0.21.3/40/#538  \n",
    "https://scikit-learn.org/stable/modules/preprocessing.html#encoding-categorical-features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Platform : win32 [win32/linux]\n",
      "Systerm  : 3.6.10 (default, Mar  5 2020, 10:17:47) [MSC v.1900 64 bit (AMD64)] \n",
      "numpy  Version: 1.16.0\n",
      "pandas Version: 1.0.4\n",
      "sklearn Version: 0.23.2\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "import pandas as pd\n",
    "import numpy as np \n",
    "import sklearn\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "print('Platform : {} [win32/linux]'.format(sys.platform))  # 当前平台信息 \n",
    "print('Systerm  : {} '.format(sys.version))\n",
    "print('numpy  Version: {}'.format(np.__version__))\n",
    "print('pandas Version: {}'.format(pd.__version__))\n",
    "print('sklearn Version: {}'.format(sklearn.__version__))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Max : [9]\n",
      "Min : [0]\n",
      "Mean: [4.8]\n",
      "Std : [2.87402157]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(1)\n",
    "x_raw = np.random.randint(0, 10, size=(20,1))\n",
    "\n",
    "print('Max :', x_raw.max(axis=0))\n",
    "print('Min :', x_raw.min(axis=0))\n",
    "print('Mean:', x_raw.mean(axis=0))\n",
    "print('Std :',x_raw.std(axis=0))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "## StandardScaler  \n",
    "使用均值与方差，对服从正态分布的数据处理，得到符合标准正态分布的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Max : [1.4613669]\n",
      "Min : [-1.6701336]\n",
      "Mean: [9.99200722e-17]\n",
      "Std : [1.]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#标准化需要计算特征的均值和标准差\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "#标准化，返回值为标准化后的数据\n",
    "x_pro=StandardScaler().fit_transform(x_raw)\n",
    "\n",
    "print('Max :', x_pro.max(axis=0))\n",
    "print('Min :', x_pro.min(axis=0))\n",
    "print('Mean:', x_pro.mean(axis=0))\n",
    "print('Std :',x_pro.std(axis=0))\n",
    "\n",
    "fig, axs = plt.subplots(2, 1, figsize=(12, 10))\n",
    "axs[0].plot(x_raw, marker='o', linestyle='dashed', linewidth=1)\n",
    "axs[1].plot(x_pro, marker='o', linestyle='dashed', linewidth=1)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "## Normalizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Max : [1.]\n",
      "Min : [0.]\n",
      "Mean: [0.9]\n",
      "Std : [0.3]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 标准化是依照特征矩阵的列处理数据，其通过求z-score的方法，将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据，其目的在于样本向量在点乘运算或其他核函数计算相似性时，拥有统一的标准，也就是说都转化为“单位向量”。规则为l2的归一化公式如下：\\\n",
    "from sklearn.preprocessing import Normalizer\n",
    "# 归一化，返回值为归一化后的数据   norm : 'l1', 'l2', or 'max', optional ('l2' by default)\n",
    "x_pro=Normalizer(norm='l2').fit_transform(x_raw)\n",
    "\n",
    "print('Max :', x_pro.max(axis=0))\n",
    "print('Min :', x_pro.min(axis=0))\n",
    "print('Mean:', x_pro.mean(axis=0))\n",
    "print('Std :',x_pro.std(axis=0))\n",
    "\n",
    "fig, axs = plt.subplots(2, 1, figsize=(12, 10))\n",
    "axs[0].plot(x_raw, marker='o', linestyle='dashed', linewidth=1)\n",
    "axs[1].plot(x_pro, marker='o', linestyle='dashed', linewidth=1)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "## Binarizer  \n",
    "Values greater than the threshold map to 1, while values less than or equal to the threshold map to 0. With the default threshold of ,  only positive values map to 1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Max : [1]\n",
      "Min : [0]\n",
      "Mean: [0.7]\n",
      "Std : [0.45825757]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsIAAAI/CAYAAAB9Hr8eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeXwU5f0H8M+T3SSb+w45SSBAICRAIHKLt+CNWLUeVK3Vtmqrtj9Uaqu1WrFS7c9aa72vn7cieBJvFMIVSEiAEK7cCbk35ybZY35/gBQwgYTM7jM783m/Xrwqw2bmk2ky+92Z5/k+QlEUEBEREREZjY/sAEREREREMrAQJiIiIiJDYiFMRERERIbEQpiIiIiIDImFMBEREREZEgthIiIiIjIks6wDR0dHK6mpqbIOT0REREQGsWXLliZFUWKO3S6tEE5NTUV+fr6swxMRERGRQQghKvrbzqERRERERGRILISJiIiIyJBYCBMRERGRIbEQJiIiIiJDYiFMRERERIbEQpiIiIiIDEla+zTyvJUFNVieW4paqw0J4QFYMj8dC7MTZcciMgT+/hGRUWn5+sdC2CBWFtRg6Ypi2OxOAECN1YalK4oBQDM/jER6xd8/IjIqrV//ODTCIJbnlh7+IfyBze7E8txSSYmIjIO/f0RkVFq//rEQNohaq21I24lIPfz9IyKj0vr1j4WwAbhcCoIt/Y+CSQgP8HAaIuMZ6PeMv39EpHdav/6xENa5NpsdN72aj6ggP1jMR//fHeBrwpL56ZKSERnHkvnpMPuIo7bx94+IjGDJ/HSYNHz9YyGsc/d+UIzkyEB8fudpeOSySUg89AlsRKg/li3K0sRAdSK9u2RKAkIDzIgJ9gcAxIdZ+PtHRIawMDsRi6YmIj7MAgEgMTxAU9c/oSiKlAPn5OQo+fn5Uo5tBB9tq8WpY6Nh8TXB4muSHYfI8KpaupEcGYhLnlqHP14wAaekRsqORETkVn0OF9btbcIZ42NlR4EQYouiKDnHbucdYZ3pdTjxx5XF+McXu9Habe+3CG6z2XH7WwWQ9SGIyGheW1+OsEBfAMDd89ORHBEoNxARkQf8Z80+vLahQtP1BgthHXG5FCx+fhMaO3qx6rY5GBUd1O/rQi1mbK1sRUldh4cTEhnP7voO/PPrvbCYD34onTk6ChZfXnqJSN/2NnTgpXVleGhhJoQQJ/4CSXg11omypi74+Ajcd1EG/nPtNIRYfAd8rRACCybGYfWOAx5MSGRMr+SV4+rpI+F3aLLqlspWXPfSZsmpiIjc65W8Ctxx9jjNdIcYCAthL+dyKXjqm7248pn1aOnqQ2Zi2KA+eS3IjMfuA7wjTOROvQ4nvthZj2tmjDy8bXxcCPbUd8Dp0u6jQiKi4XC5FPz54olYPDNFdpQTYiHsxTp7Hbj5tS34sqQeq26bg8ggv0F/7dSR4fjP4mluTEdE/mYTvl1yOmJDLYe3hVh8ERXsh/LmLonJiIjco67NhgufXAuHywUfH+0OifgBC2Ev5XC64GfywYxRkXj75lmIDxvaowchBL7Z1YD3tlS7KSGRsTldCh74aAd8+nlCc8PsUdD+2wMR0dAoioI/frAd8yfGwd/sHR2rWAh7oQ8KqnHpv/Ng8hG4ad7ow2MPh8rP7IPX1permo2IDvpmVwO2Vlr77dzy87mjMDomWEIqIiL3+bioDlWt3fj16WmyowwaC2Ev0udw4b5V2/HEl3vw6E8m/WillqGaPioSlS3dqNHIet9EevJyXjmun93/+LhNZS248+1CDyciInKvtJhgPH7FlJO+QSeD9yQl7GvsRHNnH1bdNhcT4kOHvT9fkw/OzYhDQWWrCumI6Adt3XY0dPTg/Kz4fv99RKg/Nuxv9nAqIiL3WVlQg5SoQGQmhsmOMiQshL1A3r4m/OOL3ZgQH4qnrpmKsICBW6MN1bJFWbhwUoJq+yMiICzQF7l3zBtwjFxyRCA6ehywdvd5OBkRkfrW7mnC8txSeGMvHBbCGqYoCv6zZh9uf6vQbcux+vgIPLp6F5o6e92yfyKjabPZ8cvX8nG8hZR8fATOyRiBxg7+3hGRd7P1OfGHD4rx0KWZCPY3y44zZCyENezdLdX4bPsBrLp1DuaOjXbbcSpbuvHlznq37Z/ISN7Nr4K/2XTCtkH/uHIKxo4I8VAqIiL3WL+/CTmpETgjPVZ2lJPCQliDdtd3oKjaikuzE/HOL2e6fVWWBZlcZY5IDU6XglfXV+C62aknfG1BZSue/36/+0MREblJn8OFM8ePwGOXT5Yd5aSxENaYD7fV4qfPbkBlSzd8TT4e6cN3enosdta2o8fudPuxiPSsrs2GrMQwTB0ZfsLXKgBWFta4PxQRkRvYnS4senodiqqtg1rRVqu8bzCHjj31zV68vbkKr904HRMTPDfrMtjfjHX3nAlfEz8XEQ1HYngAnrpm6qBeOz4uBHsbOuFwumDm7x4ReZnnvt+PyCB/ZHlZl4hj8eqrAQ3tPeh1ODF/4gh8dNtcjxbBP6hv7+FjWqJh2NvQgZ+9uGnQrw/0MyMhPAAVLd1uTEVEpL6ypi48/30ZHr4006vvBgMqFsJCiDuFEDuEENuFEG8KISxq7VvPNuxvxoVPrkXe3maMiQ1BWKB6rdGGItjfjCe+3IPuPoeU4xN5u1fyKpCdfOIhEUdaffs8pHGFOSLyMiNC/fH0NVORFBEoO8qwqTI0QgiRCOC3ADIURbEJId4B8FMAL6uxf71YWVCD5bmlqLXakBAegFNSI7B2bzMeu2IyThsXIzVbeKAfJieH47vdjViQ2f8iAETUv/YeO1YV1uCL3502pK+raO5CbVuP9N9/IqLBWr39AFKiAjFjdJTsKKpQc2iEGUCAEMIMIBBArYr79norC2qwdEUxaqw2KABqrDZ8UlyHW04frZk3wfmZcVizu0l2DCKv09DeixvnjsaI0KE9CKto7sYLa8vclIqISF317T34wwfF8PLREEdR5Y6woig1Qoi/A6gEYAPwuaIon6uxb71YnlsK2zFdGexOBS+sLcfP546WlOpoV+QkwezDYeNEQ+FyKUiJCsTtZ48d8tdOSAhFSV27G1IREanvvlXbce2MkRgfFyo7impUqXqEEBEALgEwCkACgCAhxLX9vO5mIUS+ECK/sbFRjUN7jVqrbUjbZfA3m/D1rgYUVlllRyHyGt/ubsDNr+af1NcmhFnQa3dyZUci0rymzl7Y7C7ceuYY2VFUpdbtv7MBlCmK0qgoih3ACgCzj32RoijPKoqSoyhKTkyMNoYDeMpAi2K4e7GMoSpv6sLbmytlxyDyGi/nVeCCSQkn9bVCCLxx00yEWNjJkoi0q7vPgfAAX7z68+keWd/Ak9QqhCsBzBRCBIqDfTTOAlCi0r51Ycn8dFh8jz7dAb4mLJmfLilR/+ZPjMPnO+rhdCmyoxBp3r7GTuysbcOFk05+gmlcmAV11h4VUxERqesvH+3EM9/ps8WqKoWwoigbAbwHYCuA4kP7fVaNfetFZmIobp43GonhARA42Hh/2aIsLMxOlB3tKCOjAjEi1ILCqlbZUYg0T1EU/OnCDFh8T/4OyVcl9Xjiqz0qpiIiUk/evias2d2In81KkR3FLVR7Hqcoyv0A7ldrf3rz72/2YVxcCNbdc6bsKCf05k0zERrAR7VEx9Pd50BsqAVjYkOGtZ8J8aF4aV25OqGIiFTU53DhDyuK8eAlmQixyFnnwN3YIsADmjp78WVJPX56SrLsKIMS5G/CC2vLoCgcHkE0kLc3V+H+VTuGvZ9xI0JQ1tSFXofzxC8mIvIgP7MP/nlVNs7OGCE7ituwEPaAFVurccGkeIQH+smOMigmH4E3NlWiqLpNdhQiTXK5FLySV45rZowc9r4svib85ZKJcDj5wZOItGN7TRte31iBSUlDWzHT27AQ9oAb5ozCPQsmyI4xaEIILJgYh9U7DsiOQqRJa/Y0IthixrSUCFX2d0VOMswmHXWoJyKv5nC6cM+KIt11iOgPC2E3W7e3CZvKWhAW6F1jaxZkxiGXhTBRv1KjgvDAxRMhVFpe6YW1ZXh0dakq+yIiGq4X1pYhPMAPl03V1oR+d2Ah7GaPf7EbHT122TGGLCsxDG/dNFN2DCLNqW/vgb/ZB9NSIlXbZ1psMFeYIyLNKGvqwl8vzVTtw76WsRB2o+LqNhxo68HZE7xvkLkQAt19Tny/x1grABKdyNPf7sPrGytU3WdG/MGlljlBlYhkUhQF9e09eOSySUiJCpIdxyNYCLvR6h11WDwrBWaTd57mho5eLPt0l+wYRJrR0WPHBwU1uHamuv00Y0P8cU7GCPTYXarul4hoKN7Nr8btbxXIjuFRbBbrRv9zbjocXrxC27SUCDR09KCyuRsjowJlxyGS7v0t1Zg7JhrxYeoujS6EwKM/mazqPomIhqKhvQd/W70Lr904Q3YUj/LOW5Ve4M1NlVi7twm+Xno3GDjYRu2cjDh8tr1OdhQiTTg/Kx53Lxjvln2/sbESr21Qd8gFEdFgPbJ6F648JRkZCaGyo3iU91ZpGmZ3uvDEl3sQFeQvO8qw3XnOWFyj8mNgIm+0s7YdVpvdbU9H/M0+2FTW4pZ9ExGdyN0LxuO3Z42VHcPjWAi7Qe6OAxgZFaiLT1WxIRZsqWhFU2ev7ChEUj2auwuFVVa37X/CoQlzRESe1N5jx13vbUNUkB8svvrvG3wsFsJusK3Kihtmp8qOoZqVBTX4rJjDI8i49jd2ori6DRdPTnDbMcbEBsNHHGxkT0TkKY98tgtmk4/XTuwfLmN+12527wUZOC8rXnYM1SzI5CpzZGxvbKzElacku/VuiZ/ZB5/feZph34yIyPM27m/G1yUNuOc898x98Aa84qrswY93Im9fk+wYqpo3NgZFVW1o7eqTHYVIijvPGYdfnpbm9uN8VlzH3t1E5DH1Hb14aGEmQi3etfqtmlgIq6i5sxfv5ldhfJz3jw0+UoCfCe/+ehZCLOy2R8bzVUk9ypq6EBbg/jeKqtZufFXS4PbjEBHtqe/ARZPicXaG9y36pSYWwip6a3MVFmTGITLIT3YU1Y2MDETevmbZMYg8yuVS8NdPStDd5/TI8SbEh2InJ8wRkZuV1LXjymc3wNptlx1FOhbCKmqz2XGdjibJHcnhUnDL61vR2euQHYXIY77f2wR/XxNOSY3wyPEmxIdiF5daJiI3croU3P1+Ee6an44IHd64Gyo+61aJy6XgD+dPkB3DbUItvshJjcA3uxpwkRtnzpN+rSyowfLcUtRabUgID8CS+elYmJ0oO9ZxfVhYixtmp0II4ZHjRQf74/u7zvTY8YjIM2Rf/448fnigL6KC/HDlKckeO76W8Y6wSn724ia39hjVggUT2T2CTs7KghosXVGMGqsNCoAaqw1LVxRjZUGN7GjH9bfLsnDpVM8W63sbO7GvsdOjxyQi95F9/Tv2+K3ddlRbbVhVWOuR42sd7wirYHtNG/Y1dmKiDhbQOJ7zsuIxOTlcdgzyQstzS2GzHz3O1mZ3YnluqWbvCr+0rgw5KZHISgrz6HE/33kAQX5mQ67wRKRHA13/Hvls11HXl9HRQejodaCx478LWI0ItcBi9kFFS/fhbSH+ZsSGWlDd2o1ex8G+4yYhkBodhNauPrR0/7fDU2J4AB5dvetHx++xuzR9/fUkFsIqeCWvHNfOTIGvzvt/hgX4oqPHjrKmLoyKDpIdh7xIrdU2pO2ydfU68MRXe/DJb0/1+LEz4kOxejufvBDpxUDXuQPtPbjplfzDf//8znlYu6cJf88tPbztgUsmIisx7KjXLciMw10LxuPhT0uwq64DABAa4IuVt87Bx0W1eGld+eHX/uvqqahr6xlSLqNhIayC+DALrpo+UnYMj/hyZz2Ka9rx2BWTZUchL5IQHoCafi66CeEBEtKc2Iqt1Zg1OgqJEvJNiA/FP77Y7fHjEpF7DHT9SwwPwNf/c/pR287Pisf5/SzIdezrAODf10z70bbFs1KxeFbqoI6v1euvp+n7FqYHdPY68Ltz03XZMq0/506Mw1e76mHnMrA0BEvmp8Pi++PLzeSkMLhc2uuQsLGsBddL6gAzOjoIDy3MknJsIlLfkvnpCDjm+hfga8KS+ekePP7Rq2J68vhax0J4GBxOF+b/4zuUN3XJjuIxCeEBSIkKwob97ClMg7cwOxE/m5UCP7MPBA7eCXng4gy4FMBq014fyyevysb0UZFSjm02+WBcXDDa2N+TSBcWZifirgXjkRgecPj6t2xRlsfG5y7MTsSyRVnSjq91Qla/ypycHCU/P//EL9SwT4vr8NK6Mrz7q9myo3hUcXUb4sIsiAnxlx2FvIjD6UJrt/1HPzeuQz0tr5+TiokJnp2Y1p97PyjG4lkpUleIXPLuNkxODse1M1OkZSAidbR29eG05d/gu7vOQHigMZ4ea5EQYouiKDnHbucd4WF4Oa8c188eJTuGx2UlhaHGaoNTg4+0Sbu+39sEP/OPLzk+PgKnjovB4hc24b0t1RKS/Vd5Uxc+234AqVFyJ4NOiA9FCVeYI9KFtzZX4ZyMOBbBGsVC+CS5XArOz4zDuRONuUb3Pe8XoaCyVXYM8hKKouB3bxei197/UsUXT07AWzfPxL+/2YstFfJ+rl5dX4HLc5JgOWY8naexECbSB4fThf/bUCFtzgGdGAvhk1TZ0o3rZqfqvmXaQOZPjGOLJxq0iuZuBPiaEBtqGfA140aE4NPbT8W0lAh8ubO+31nO7tbc1YvFGhiOMDExFBdM4gqORN5OAfCnCyd4vB85DZ4xq7hhau3qw8X/WgurgSezLMg8uMqcrDHm5F0Kq6yYMvLEi7H8cCe2oqUbl/xrHdbuaXJ3tMMURcETP81GUkSgx445kFCLL26cO4q/X0RerqDSinMz4mTHoONgIXwS3tpchXMnxiHCIC3T+jM+LgT3nj8BHCZMgzF9VCR+c+bgV0q7ce4o/POqKbjznUKsKnT/MqSKouCyp/NQdcTqTbL97u1C5HJJcyKvVVLXjt+8uRVOfqDVNBbCQ+RwuvDa+nLDj/cRQuDMCbGo1FDhQNplszsxbkTIkL5mdlo0PrptLuaMiUZjRy/a3Nhmbe3eJnT3OZEUoZ0G8wnhAdh5aNUoIvI+r+SV45oZ+l911tvx/50hUgA8uDATmYkc77Ozth03verdLfDI/XodTlzwz+/RM8BEueOJC7MgOtgfnxbX4ZJ/rXXbBLKX15XjutmpEEK4Zf8ngxPmiLyXtbsPnxbXGWbVWW/GQniINpe14PT0WNkxNGFyUjg6exzY28C7VjSwkroOpEYFIcj/5Fd0v252Ku44exyueX6j6kMlXC4FiREBWDhFW83lsxLDEHecyYVEpF0hFl+8cdNM9tv3AiyEh2BnbTt+9842uDjeB8DB/q/zJ45A7o562VFIwworW5E9iIlyJ7IwOxFv3DQDFl8TFEWBQ6VlvvucLvzlkkwE+MltmXaskVGBeHBhpuwYRDREDqcLKwtqkBEvb1EeGjwWwkNwcLzPSI73OcK1M1Mwc3SU7BikYePjQ7FoapI6+4oLxfyJcVizuxGXP7MedW3Da7HW1evAvEe/gbW7T5V8alv2aQm2VVllxyCiIfiypAGvb6yAj492hlrRwFjRDZK1uw+fba/DVTM43udIY0eEYExMMNp7jNtKjo4vJyUCp6RGqrrPeWNjcPaEEbj4X+uQt+/kW6x9UFCDKcnhml3xqb3HjkIWwkRe5ZW8g3MOyDuwEB6kUIsv3v3VbEQHc7zPsR7+tATv5stdGpe0ydrdh5nLvlK9H66Pj8CtZ4zB/145Be/mV5/U/hVFwSt55bh+Tqqq2dTECXNE3qWsqQv7GjtxXma87Cg0SCyEB8HhdOGd/CqMjQ2WHUWT5meOQC5XmaN+FFZZMSY22G3dGOaMicY/rpyCxo5e3P1eETqG8GSi1+HC5TlJmKXhoT0T4kPR0NErOwYRDdKo6CB88ttT4WdmeeUt+P/UIHxZ0oB38qs43mcAc8ZEY9eBdjTyDZuOUVhlxeTk4U+UO5GwQF/4mgUu+dc67K4fXBeT1u4+3DwvTVMt046VkxKBF68/RXYMIhqEtm47nv1uHztFeBkWwoPwcl4Zrp8zSnYMzfI3m/DXS7NkxyANigryw2njYtx+HH+zCQ8tzMKtZ4zBz1/eDFvf8XsWV7V044J/rkWvY+i9jT1JCIHXNlSgxjq8SYFE5H5v51diFxfB8ToshE+gorkLZU1dOC+Ta4Ufz0WTE6DhG2skyeJZqZidFu2x4102LQmf3zkPFl8ffFBQjT5H/y3WXl1fjp9MS4K/WVst0/rz/e5GbK1olR2DiI7D6VLw6voKTpLzQqoWwkKIcCHEe0KIXUKIEiHELDX3L0NKVBBW3z6PLdNOoMfuxBnLv0VbN7tH0EFVLd345WueX3kw0M+MXocLnxTV4arnNqC+veeof+/uc+C9LdVYPDPF49lOBifMEWnftmorRoRaPDIUjNSldnX3BIDViqKMBzAZQInK+/coa3cfnvpmLyKCtNlaSUssvibMTIvCV7u4uAYdtLWyFQJyHhNYfE14dnEOzkiPwUVPrkVFcxdWFtRgziNfY+J9uRBCYIuX3GVlIUykfVNHRuDNm2bKjkEn4eTXPD2GECIUwDwA1wOAoih9ALTZpX6Q3t5chX0NnbJjeI0FE+Pw2fYDqi2eQN6toNKKKSqsKHeyfHwEbjtzLOaOjcGW8lYs/aAYvYeGSrR09WHpimIAB1es07J546IxLSVCdgwiGsDu+g58VnwAt589VnYUOglq3hEeDaARwEtCiAIhxPNCiCAV9+9RHO8zdGdPGIFTx3puPChpW1evA1NHyi/gpiSH47Evdh8ugn9gszuxPLdUUqrBC/QzY099Bzp7HbKjEFE/Xs4rhwJ1e6WT56hZCJsBTAXwtKIo2QC6ANxz5AuEEDcLIfKFEPmNjY0qHlp9xTVtSAwP4HifIQgL9MXimSl8wyYAwPLLJ2P6KHVXlDtZtQN0XRhou9Y8/sVuFFVzhTkirWnrtuPjbbW4mqvOei01C+FqANWKomw89Pf3cLAwPkxRlGcVRclRFCUnJsb9LZWGY0pyON64aYbsGF7nvS3V+MOhR85kXHvqO/DMmn2yYxyWEB4wpO1ac3CcMNsyEWlNUY0VF0yKR2yIRXYUOkmqFcKKohwAUCWESD+06SwAO9XavyeVHujA33NLYWaniCE7LT0G35Y2aL4/K7nX+v3NKGvqkh3jsCXz0xHge3SrtABfE5bMTx/gK7SFE+aItOnUsTFYtmiS7Bg0DGpXer8B8LoQogjAFAAPq7x/j3g5r5zt0k5SbIgF6XEhWLe3SXYUkqiw0oopGhpWtDA7EcsWZSExPAACQGJ4AJYtytL8RLkfnDE+BlfkJMuOQURH+KqkHo9/sVt2DBom1bpGAICiKIUActTcp6e1ddvxSVEtvvz9abKjeK1fzktDqMVXdgySaEdtO26aN1p2jKMszE70msL3WPFhAfA3m+B0KTBxqXciTXhxXRl+Mo1dkrwdb3seY3ttGy6eksDxPsNwdsYITE4Oh9PFWbRG9eFv5iB9RIjsGLryk6fzsJftHIk0YU99B3bXd+L8rHjZUWiYWAgfY86YaDy0MEt2DK/3sxc2YWNZs+wYJMGe+g5sKmuBD+9cqorjhIm0o7KlG786Lc0rlmmn42MhfIQvd9bj0dW7ZMfQhbljo5G7/YDsGCTBZ9sPYC3HiKtuQnwIC2EiDXC5FJw1YQRunDtKdhRSAQvhI7y4rgzpcXycq4b5E+OQu6MeLg6PMJzCKiuyNTRRTi9OHRuD8fG8PhHJ9uK6Mvzzqz2yY5BKWAgfsru+A3saOnFeJsf7qGFMbDAunZqIrj4urmEkiqJgW5WVC9G4weTkcFyazYk5RDL9sOosV1HVDxbCh9RYbbjtjDHwM/OUqOXuBeMR6KdqYxLyAi/fMB3xYd6xUIW3ueCf36Oxo1d2DCLD+mZXAyICfZGtgeXjSR2s+nDwE94Z6bG4bnaq7Ci6UtncjfOe+A6KwuERRlHdakNEEFvnuUuwv5njhIkkEgL47VljZccgFbEQBvDi2jI8/nmp7Bi6kxwZgO4+J3Yd4NKwRvHSunJ8tK1OdgzdYucIInm6+xw4c3wszpowQnYUUpHhC2GnS8GrG8pxxvhY2VF0RwiBBRPjsJrdIwyjsKpVUyvK6c30UZEQ7EpHJMWyT3fhhbVlsmOQygw/gPPrXQ2IDPLneB83uWRKIvIrWmTHIA/oc7hQUteBrKQw2VF0i837ieRo77FjVWENvvgdV53VG8PfEfY1CdxxNsf7uEtWUhhumDOK44QNwOlS8MhlWQj2N/zna7dRFAW/fbMAvQ6n7ChEhvJufjVOS4/FiFCuOqs3hn7H6ux14NSxMTBxBSy3+ve3e2ESAr88LU12FHIju8uFiyYlyI6ha0IIlNS1Y099JzITeeedyFPGxgZj1ugo2THIDQx9R/iRz0rwwtr9smPoXlZiGD7jOGHd+/OHO/B2fpXsGLrHCXNEnlXXZsOM0ZHISAiVHYXcwLCFcJvNjg8La7FwSqLsKLo3c3QUypu7UNdmkx2F3KiwyorJSZwo524T4kNR1tQlOwaRYdz1XhE+LWY3HL0y7NCId/OrcMb4WMRyvI/b+Zp88Iu5o9DU0ceFFnSqzWZHfVsPxo0Ilh1F9246dRSHcxF5yN6GDpTUdXCiqo4Z9o5wRkIofn06x6x6ym1njmU3AR2z9TlxyxljYDYZ9pLiUS+sLeMEVCIPeCWvAldNT4a/2SQ7CrmJId+1qlu7kZ0cgfFxHO/jKYqi4OJ/rUVzJ5eH1aO4MAtuPWOM7BiGYPIRePrbfahv5+8SkbstzE7A4lkpsmOQGxlqaMTKghoszy1FjdWGiEBf3H/RRCzM5hhhTxBCwAfAWY+tQZvNjoTwACyZn87zrxO/fbMAV00fiVlpnFXtbkKIwxPm4sI4tGuwfrj+11ptvP7QoBRXt2FMTAjCArlsvJ4Z5o7wyoIaLF1RjBrrwQlbrd12LF1RjJUFNZKTGcPKghrsqGuH1WaHAqDGauP51yONLosAACAASURBVAlFUbBubxNSogJlRzGMCfEh2MnOEYN25PWf1x8aDJdLwW/e3Iq9jR2yo5CbGaYQXp5bCpv96Cb0NrsTy3NLJSUyluW5pbA7jx7TyPOvD9WtNvj4CMTz7qTH3Dh3NK7ISZYdw2vw+k9DtWZ3I4ItZkzlqrO6Z5hCuNbaf+uugbaTunj+9aulqw8XTUqAEOxk4ClRwX6obGELtcHi9YeG6uW8clw/exSvawZgmEI4Ibz/tl0DbSd18fzr1+TkcNx3UYbsGIaiKMDVz21Ej51LLQ9G+ABjPHn9oYHcd1EGLpzElmlGYJhCeMn8dAT4Ht3+JMDXhCXz0yUlMhaef/26f9V2VDTz7qQn+Zl9MCo6CKUHOH7xePocLvz5wx3wEYC/+ei3O15/aCC5Ow4g1OILiy9bphmBYQrhhdmJWLYoC4nhARAAEsMDsGxRFmcNe8gP5z8h/OA40rhQC8+/DtidLryTX43IID/ZUQwng0stn9Dd7xehurUbX//PGfjbZZMOX//jw3j9of519Nhx13tFcLrYp9soDNU+bWF2Ii98Ev1w/u95vwiLpiZh+qhI2ZFomEoPdCApIgAhFrYX8rRrZo5kk/8BbK1sRUZ8KJaeNx7Rwf7w8RFHXf931rajqrVbckrSove2VGPu2Gi2JjQQw9wRJu145LJJLIJ1Yn9TF3JSOatahmkpkRgTyyWtj6QoCp79bh9ufnULypq6EBtqgU8/y1H3OV148OOdvOtHP/L25ircMDtVdgzyIBbC5HHtPXbc836R7BikgosnJ+DhS7NkxzAka3cfpv/1Sy61fIjLpeDWN7bi46I6rLptDibED7xy6JTkcEQF++PrXQ0eTEje4I2bZmJaCj/cGwkLYfK4EH8zviypR1ULH016u39/uxedvQ7ZMQwpPNAPFl8TqlvZAqy9xw4fH4FLpiTinV/OQuIgukHcMDsVH26r9UA68hbPfrcPLkVhyzSDYSFMHieEwKy0aKzf3yw7Cg1De48d//p674+6gZDnTOCEOXy0rRZnPbYGLV19mD8xbtAz/S+cFI9/XDHZzenIW+xv7MQza/Yj2N9QU6cILIRJktlpUdhR0yY7Bg1DUVUbJiaEwmziZUSWCyfFI8igb9x2pwt/+WgnHs3dhZeuP2XInUvMJh/sru/Ec9/td1NC8iavrq/AT6cns2WaARnzCkrSXZGTjH7msJAXKaxqxZTkcNkxDO1yAy+z3GN3os/pxMe3nYqwARbMOJHoYD88+fUeXJGTfNL7IO/ndCn4trQBb948U3YUkoC3ckgKk4/AG5sqOU7Yi/187ijccvoY2TEMrb69B4tf2Cg7hkdtKmvBDS9tQqCfGQ8tzBpWARsbasEZ42Px7pYqFROStzH5CHz5u9MQH8aVBo2IhTBJs6WiFWt2N8qOQSdBURR8W9qI0ADeRZMpKsgPm8tbDDFhUVEUPP/9ftzy+hZcP2cUTCo9Urpudio2lbWosi/yPi6XgiXvbkM3lys3LBbCJM3stGis38cJc96oxmrDfat2cHiLZGaTD8bGhqD0gP4nzBXXtOHDbbX44JY5OG1cjGr7zU4OxzOLp6m2P/Iu3+1pxI7adoQYdKw9sRAmiWalRWHD/mb2QfVC26raMCU5nG2GNGDm6Ei0dNllx3CbvQ0deGdzFSYlhWPlLXOQHBmo6v6FENjX2Im73tum6n7JO7ycV47r56TyWmZgLIRJmsTwAKy+Yx4vQF6osKoV2SM5UU4L7r0gA+dkjJAdwy0+KarDFc9sOPz3/laJU0NyZCC+3tWIvQ0dbtk/aVN3nwNtNjsunpwgOwpJxEKYpGqz9WFLRavsGDREi6Ym4ZIpfPPQggNtPfjHF7tlx1DdBwXVWPZZCV65YTquOMW93TH8zSZcPWMkXsmrcOtxSFsC/cz44JY5bJlmcCyESaqddR14+tt9smPQEDicLgT6mZAUoe4jajo5Ab4mPP/9frhc+hhi1NDRg8rmbpyTEYePbpuLrKQwjxz32hkj0dLdx6FaBtHZ68CVz6xHn8MlOwpJxkKYpJo1Ogqbyprh1MmbuBHsOtCBX7ySLzsGHRIW6IvwQD9U6qAV4ebyFlz85Dp8v7cRwf5mRAxxkYzhiA214Kmrp3rseCTX+1uqERXsBz8zyyCj408ASRUT4o8RoRbsqOUqc95iW7UVk7mQhqaMjwvBLi/vHPHmpkr8+v+2YNllWbhmRoqUDHVtNlzy1Dp+MNc5l0vBK+vLcd2sVNlRSAPYL4Ske/LqbCTzMbvXKKy0ckU5jXniqmwE+XnnOEdbnxP+Zh+Mjg7CB27oCjEUcaEWAMC3pQ04a4I+JyAS0NLdh+zkCEwfFSk7CmmAqneEhRAmIUSBEOJjNfdL+pYaFYTSes7W9hZzx0bj1LHRsmPQEXrsTnyxs152jCHb19iJi/+1Fl/tasCM0VFSi2DgYCu162en4uW8cqk5yL0iA/3w2BWT2bGIAKh/R/h2ACUAQlXeL+lYj92Jn72wCVv/dA7Ha2mcy6Xg4skJfAPRmHabHQ98tBPnToyTHWVAKwtqsDy3FLVWGxLCA3DuxFh8WFiH/5mfjrMnxMqOd9gFk+JRWGWFw+mC2aSf69Gx53/J/HQszE6UHctjjvz+zSaBRy+bhEunJsmORRqg2m+5ECIJwAUAnldrn2QM4YF+SIkKRFG1VXYUOoH1+5tx/UubZcegY6REBaG1uw9tNm0urLGyoAZLVxSjxmqDgoMrE762vhLXzU7BVdNHauqDlb/ZhL9ckgm7Uz/jhPs7/0tXFGNlQY3saB5x7Pdvdyr4wwfbDfP90/Gp+XH3fwHcBYC9SGjIZqdFIY/LLWteYZUVY2ODZcegY5h8BMaNCMGuOm1OmFueWwqb3XnUNodLwdubqyUlOr6OHjtOffQbtPdo84PFUPV3/m12J5bnlkpK5FlG//7p+FQphIUQFwJoUBRlywled7MQIl8Ikd/Y2KjGoUknrjwlGaenx8iOQSdQWGXFFK4op0kPLcxEelyI7Bj9qrXahrRdthCLL2alReHdfG0W6kPlbedfbUb//un41LojPAfAxUKIcgBvAThTCPF/x75IUZRnFUXJURQlJyaGRQ/915jYECSEB7C5ucYlRQRg6sgI2TGoH2kxwZodGpEQHjCk7Vpw/ewUvLq+XBcLlXjj+VeT0b9/Oj5VCmFFUZYqipKkKEoqgJ8C+FpRlGvV2DcZx82v5iO/vEV2DDqO+y+ayDcPjdpR24bfvFkgO0a/lsxPh/8xE2EDfE1YMj9dUqITmzoyAotnpqBXBx/O7zh7LI4dhe1n9tH0+VfT788Zi2OHoWv95488Rz9TYsnrzeI4YU37qqQej3+xW3YMGsD4+FDsqe+Ew6m9wq27z4n7L85AYngABIDE8AAsW5Sl6a4FQgj84tTRaO3ukx1l2BZNTcIvTh11+PxHBvoiPMCMBZna7TKipuYuO8bEBCEx3OI1P3/kOaovqKEoyrcAvlV7v6R/s9Oi8djnpQD4KV2LNpa1IMSfa/BoVbC/GTEh/ihv7sKYWO2MFf6mtAFPr9mL3Dvm4erpclaMO1kOpwuXPLUOb908E2kx3jlJdGdtO+rabLj3ggzce0HG4e23vbEVWytaMXuMvnuCd/Y68Nz3+/Hur2YhJSpIdhzSIN4RJs2YlhKBczKMcYfCGxVWcqKc1t1x9lhYfLWzwlxnrwN//GA7Hr40C4F+3vchymzywZU5yXjVSxfYcDhduPv9IjR3/fiu9pNXZWP2mGj0Opz9fKV+BPub8eXvT2MRTANiIUyaYfE14denp8GuwUe7RqcoCrrtDkxKYiGsZYumJiEhTDtjuLdUtGLeuBicOtZ7J0dfOzMFKwtrvbKV2kvryhEaYMbl0368cIQQAhv3N+PKZzbAqYMJgf15b0s1nlmzD6EWX9lRSMNYCJOmPP/9fvZ21CAhBD7+zakIC+AbipZ9v6cRN7+WLzsGAKC7z4HTxsVg2aIs2VGGJS7MgsevmAyThhb9GAxFUbBuXxMevjRrwAVLTkmNhJ/ZB6946R3v42ns6MWyT0swR+dDP2j4WAiTpkxODsd6TpjTnG92NeCz4jrZMegEUqOCsL1G/qIafQ4XLn0qD4VV+lgt8szxsSipa/eaVmqKoqC7z4mXb5h+3CEBPj4CjyzKwpNf70F1a7cHE7rfAx/twOU5ychMDJMdhTSOhTBpyuSkcJQ1daGt2/seQ+rZp8V1aOrslR2DTiApIgBdvQ609jMm1JOe/nYfkiMDMDlJP0XI/R/uwJrd3rEQ1HtbqnH7W4NrpTc6JhhPXzsN0cH+bk7lOS6XgszEMNxx9ljZUcgLsBAmTfEz++Dnc0fBavP+lkV6sq3aiinJXEhD64QQuDwnWep41r0NnXhlfTkeXJg54CN5byOEwPWzU/GyFwwhaOzoxd9W78Kd54wb9NfMHB2F3fUd+GJnvRuTeUZHjx0FVVb86rQ0TU0cJe1iIUya87tzxnGGr4Z09zlQ02rD+HjttOSigd13UYbU35/kyAC8eP0piNfQpD01XDQ5ATtq27C/sVN2lOP6y8c7cXlOMiYmDP1u/NIVxWj28ic/j64uxbv5VbJjkBdhIUyaU9ncjWue3yA7Bh0S6GfG5j+eDV8TLxfeIG9fk7SFT1YV1mBXXQemJOuvu4jF14TXbpyBpIhA2VGO61enjcbtZw19SMCkpHBcmp2ABz/e6YZUnrG5vAWf7zyApedPkB2FvAjf2UhzEsItKKpuQ2OHd9+Z0IsN+5tR0ayviTR6FuhnxpcSHnHXWm3484c7EOSv38fRE+JD8VVJPTo02EqtvceOxz4vRUZ86EkPCbjznHFo7upDm017399gPP3tPjxw8UR2t6EhYSFMmmM2+WDGqEhs2M/uEVrw4toy7GnQ9uNg+q/0ESHY19jp0X7ciqLgjyu344Y5ozS1qp07fFxUh/e3VMuO8SOPrt6Fps7eYY3LDvQz47UbZyDA1wRbn3cttKEoCp6+dioWZMbLjkJehoUwadK5GXHo7HXIjmF4iqKgsMqKbB0+6tarAD8TxseHos7a47Fjtnbb4Wfywa9OS/PYMWW5fk4qXl1foalWapvKWvDFznrcc546QwKe+Go3/rZ6lyr78oRdB9px9XMb4cfhW3QS+FNDmnTFKcm4avpI2TEMr66tB06XgqQIfU180rtVt87ByCjPjGXt6LEj0M+E/yyeBj+z/t9SclIiEOBn0tQTq6JqKx64OFO1IQE3nToanxTXYUtFqyr7cyenS8Hd7xfj4ikJuulSQp6l/6sWea0l725DrdUmO4ahRQb54bUbZ/ANxssUVlnxcVGtR451/4c78Ox3+z1yLC0QQuDlG6ZjVlqU7CgAgIaOHvzi1NFYkBmn2j7DA/1w/0UZWLqiSPPLL7+SVw6L2QdX5iTLjkJeioUwaVZXn4OrzElW0dyNhHCL7Bg0RM2dvXh7s/tbSH23uxEb97fgxrmj3H4sLYkJ8cd7W6pR3tQlNceuA+244J9r0d2n/jCyC7Li8fgVU2Dy0faH4PS4ECxblAUfjeck7WIhTJo1a3QU1mvo8aMR/WnVdhRVt8mOQUM0IT4UJXXuXWrZ7nTh3pXF+OulmQjyN7v1WFpU1tQldYGNH4YE/O6ccQj0U//8CyGQmRiGF9aWYU99h+r7Hy5FUbCyoAbTR0VidEyw7DjkxVgIk2bNSotGJdt2SeNwurCjpg2TOVHO68SHWWB3KmjocN+EOV+TD1687hScnh7rtmNo2bUzU/BBQY20Sb1vbqr0yJAAP7MP7n6/SFOTAwHgg4IaPGOgITnkPiyESbPSYoLwzq9myY5hWLvrOzEizMKenF5ICIHcO+YhOsjfLfvfVmXF89/vx9gR+m6VdjwJ4QGYMyYK3+1ulHL8S7MT8cRPs90+JOCa6SPhIwRe21Dh1uMMRVNnLx7+tAR/uyyLC/3QsPEniDRLCIEvdtbjm9IG2VEMKTLID/dyhSav1etwYqcbhkfYnS7c/X4RooPdU2R7k/+9MhvnZ3m2b62iKHjgox3o6HEgLsz94/d9fAQeuWySppaWXr39AC7NTsSkJD6touFjIUya1trVhw+21siOYUiB/iacOd6Yj731YGNZC577Xv1Hx89+tx9xYRZcMiVB9X17Gz+zD17fWIG8fU0eO+YHBTXYuL8FUcF+HjvmmNhgPHBJJurabFAUuUMk7E4Xrp2ZgqUq9UwmYiFMmjYrLQp5+5qlX3yN6PKn12NHrXsnXJH7ZLhpwlxzZx8eWpjJlnqH+Pr44DkPjVX975CASR4fEqAoCn712hZ8VFTn0eMeqbPXgfn/+x3q2mzsEkGqYSFMmpYcGQiLrw/KOWnOozp7Hahs6cY4A48B9XZjYoNR0dyNXoc6S+W6XAoqm7tx30UZSIrwzGId3uDiKQkoqm5DmQdaqdVabfjFqaORlRTm9mMdSwiBP188EQ9+vBOtXX0ePz4A/D23FNNGRiA+jAv8kHpYCJPmfX7nPIyKDpIdw1CKq9swIT7EECuF6ZXF14Snrp4KtR6mvLm5Ekve26bOznTE4mvCNTNGun0VtormLmTEh0pdxjp7ZAQumpSAv39e6vFjb6loxafFdbj3Ag6JIHXxXY40r7PHgZUFHCfsSQF+Ji5xrQNzx0ajxz78O8IH2nrw2Oe78eDCTBVS6c/vzk3HT6YluW3/nb0OXP3cRhRWWd12jMH6/bnjcOc54zx+3JSoQPz7mqkID/Tc2GgyBhbCpHkKgD9/tENzfSz1bEpyOC7nkqVe7+W8cvzzq73D3s/y3FIsnpnCoTLH8frGCry1qdIt+16+ehdmp0UhJzXSLfsfiiB/M0IsZvz+nW3o8lAP5VWFNeh1uDTx/ZP+sBAmzRsRakFkkJ9bWkFR/y588ns0dfbKjkHDpNYKc3+8YAJuOUPeI3lvkBYTjOe+36/6B/Z9jZ34bPsBTQ0J8DeboCgKHv9it9uPtbu+Aw98tBOcG0fuwkKYvMLstChs4HLLHnGgrQe11h5EBfERpLebEB+CkgPtJ911xdrdh1vf2Ipgixn+ZpPK6fRlxqhI+Jp8sHavuq3U0mKC8clvT9XckIA/XpiBVYW1bh2ucXAZ6SLcec44TpAjtzHeAvHklX575lhY/PhG7AmFVa2YkhzO9lg6EBtiwTUzRqLP6TqpQvbhT0sQFeTH1bsGQQiBX5+ehro2m2r7/M+afRgTE4yzM0aotk+1RAb54cFLJqKh3X3LeJc1dSIqyA/XcL4CuRGvbuQVYkMt2FzWAofTJTuK7vXYXTg9PUZ2DFLJkvnjT6oIXre3CWv3NOGuBePdkEqfLpmSiCtPGalK3/M99R149rv9mJgYqkIy9zgvKx7nZIzA7voO1ffd1etAWkwwnr/uFPYMJrdiIUxeY3luKYpr2mTH0L2F2Yn42axU2TFIJc+s2Ydn1uwb8td19Tqw7LJJCPbng8OheCe/Cg9/WjKsfXjTkIDGzl5c+cx67G1QbwlmRVFw2xtbsbKQ3YLI/VgIk9eYnRaNvH0cJ+xOTpeCX//fFt5515GYEH8UDfEDZFG1FedkjMBp4/hkYKhmp0Xh3S3Vw+qo0N3nwNwx0V4xJCA2xILbzxqLpSuKVJso+FFRHWqtPbggi8t4k/uxECavwQlz7renoQOlBzpg5phQ3ZgQH4pdQ+gcsb2mDT9/eTOs3XY3ptKvpIhAzBwVhRUn2fv8QFsP2nsc+N256V4zJGDxrFQ4XApydxwY9r7auu148OOd+NtPJnFBH/IIPvMirzEzLQrBFv7IulNhpRVTksNlxyAVpcUEIy7MAqdLgekEhZXd6cJd7xVh6XkTEMGuISftpnmjsa9x6EMFFEXB0hVFyEmNxK1njHFDMvcw+Qi8eN0pCAvwHfa+Qixm/OfaabwOkcfw4xZ5jWB/M9JigtHYwf627lLW3IXJfAPSFT+zD17/xcwTFsEA8GlxHaKC/bBoaqIHkunXtJQIXD4tacjDIz7cVou6th7cdOpoNyVzn4ggP5TWd+Cu97ad9GTBdXub8PWuBkxLiVA5HdHAWAiTV3l+7X7834YK2TF0a+l5E7B4ZorsGKSydzZX4fNBPLa+eHIC/n3NVLbOU8Fn2w/g9rcKBv16p0vBE1/uwSOXee+QgNExQdhaacWnxUMfItHV68Dd7xfB10u/d/Je/IkjrzI7LRrrOWHOLbp6Hfj3t3u9ZlwiDV57j/24Cz0oioJbXt+CvQ2dCLEM//E2AWekx2JrpRWVzd2Der3JR+DD38z16iEB/mYT/nZZFh74aAfahjjG/PEvdmN6aiQnaJLHsRAmr3JKagS217bB1ueUHUV3imva8PmOetkxyA1OtNTy25urUNNqw+iYYA+m0rcAPxMun5aEV9eXn/C135Y24L5V23XRqm5aysHxzR29gy+EHU4Xalpt+OOFGW5MRtQ/FsLkVQL9zPjLJZnoY3sv1RVWcaKcXk2ID0VFc3e/Yzcb2nvwaG4pli2aNKhxxDR4i2elYNIJfqe6eh2494PtOGuC9laPO1nXzU5FsL/5uB++ftDncKGz14H/LJ6GSE7QJAlYCJPXuWxqIvh+rb7CSiuyR7IQ1qPIID+sX3pWv2N/+5wuLD1vPDIStLuCmbdKigjEBVnxqG4deHjE41/sxoxR+hsSUFBpxS9f23LCp3fPfrcPD3y000OpiH6MhTB5nfyKVlz7wibZMXTn4UVZOFtHd6XoaN/tbsSO2qMX1iiobEWgnxmX5yRLSqV/+eUtuOGlzQN2UkiLCcafdDgk4IzxsZicHI7//XL3gK/Z29CJF9aW4X/mp3swGdHRWAiT18lKDMOe+g6097Dhv1rauu3YVdeOIB2MUaT+bSpvwRc7/zsGvM1mx6/+b4uqS+PSj00fFQkfIX60Kmafw4VvShtw9YyRuu3ZfP9FGfhoWy2aOvtveXn/h9tx+1ljkRiu7WWkSd9YCJPXsfiaMCU5HJvLWmRH0Y31+5vx7Pf7ZccgNzq4wlzH4b8/8lkJzp4wAtNHRUpMpX9CCFw3OxUv55Uftf2ZNfvwal75Sffc9QbRwf746venIzrYv9/v88FLMrF4VqrngxEdQbVCWAiRLIT4RghRIoTYIYS4Xa19Ex3r2pkpuphhrRWcKKd/GfEhKDlwcPLSgbYe5O1rxt3njZecyhgWZifgmhkjD/99b0MnXlxXhocuzdJ9z+YAPxNeySvHf9b894P2gbYePPTxToyOCeYETZJOzUrCAeD3iqJsFUKEANgihPhCURSOgifVnZ8Vr+s7KZ5WWNWKX52WJjsGuVFR1cG2g6Pu+QQJ4QG48+yxCGXPYI8I9DOjob0Xpzz0JZo6exHoZ8L8zDjDDAk4c3ws5v9jDV7OK0NDey/8zT66mxxI3ku1O8KKotQpirL10H93ACgBwHU6yS0URcGZj61Ba1ef7Ci68Nszx3JZUx1bWVCDe1duR0NHLxQANVYb/rRqB1YW1MiOZggrC2rwp1Xb0dh58Px39TnxWXGdYc7/lopW2F0K6tsPfv89DhfW7Gk0zPdP2uaWMcJCiFQA2QA2umP/REIIpEQFYsN+rjI3XB09doyLC+GKYjq2PLcUNvvRbaxsdieW55ZKSmQsy3NL0es4uve5ze4yzPlfnlsKu/PoJ3g9Bvr+SdtUL4SFEMEA3gdwh6Io7cf8281CiHwhRH5jY6PahyaDmZ0W9aOZ2DR0nxbX4aGPOYJJz2qttiFtJ3UZ/fwb/fsnbVO1EBZC+OJgEfy6oigrjv13RVGeVRQlR1GUnJgYjg+i4Zk3LobtvlTAiXL6lzDAWNSBtpO6jH7+jf79k7ap2TVCAHgBQImiKI+rtV+igYyPC8U9nPU+bIVVbZjMQljXlsxPR4Cv6ahtAb4mLOFCBh5h9PNv9O+ftE3N22lzACwGUCyEKDy07Q+Konyq4jGIjvLUN3uRFhOEBZnxsqN4rQsnxXN5XZ1bmH1w3vLy3FLUWm1ICA/Akvnph7eTexn9/Bv9+ydtE7JaUOXk5Cj5+flSjk368fK6MpTUdeBvP5kkO4pXcrkU+LCPJxER6ZwQYouiKDnHbufKcuTVZo+JRt7+JtkxvNbza/fjsc85c5uIiIyJhTB5tbGxwYgK8kebzS47ilcqrLIiLSZYdgwiIiIpWAiTVxNCYOWtcxAWwB64J6Ow0sqJckREZFgshMnrba9pw9Pf7pMdw+v02J2YlhqJ1KhA2VGIiIikYCFMXi/I34xX8soha+Knt7L4mvDkVdk42PmQiIjIeFgIk9dLjQqEEEBZU5fsKF7lue/246NttbJjEBERScNCmLyeEAKz06JRXNMmO4pX+aa0AcEWrsxHRETGxXdB0oVHfzIJJvbDHTSnS0FxdRsmJ3GiHBERGRfvCJMuKIqCf3yxGy4XxwkPRkNHD9LjQhAZ5Cc7ChERkTQshEkXzCYfrCyswe6GDtlRvEJ8WADe+/Vs2TGIiIikYiFMujE7LQrr9zXLjuEVXt9YgeJqjqkmIiJjYyFMujErLRp5LIQH5fUNlXC4XLJjEBERScXJcqQb50wYgTPSY2TH0DxbnxNlTV3ISAiVHYWIiEgq3hEm3QjwM6G4pg1VLd2yo2jazrp2jBsRDH+zSXYUIiIiqVgIk67kbj+AT4rrZMfQtGkpEXjjppmyYxAREUnHQph0ZVZaNCfMncDq7XXo6nXIjkFERCQdC2HSlZmjI7GlohV2JyeCDeTBj0vQ1eeUHYOIiEg6FsKkK+GBfnjtxungGnM/trKgBjMf/go1VhuufX4DVhbUyI5EREQkFQth0p3UqCDsb+qSHUNTVhbUYOmKYhxo7wEA1Fh7sHRFMYthIiIyNBbCpDuFVVbcv2qH7Biasjy3FDb70cMhbHYnlueWSkpEREQkHwth0p1TRkViW7UVPXaOg/1BrdU2pO1ERERGwEKYdCfYr0JLzwAAIABJREFU34z0uBBsrWiVHUUT2mx2+Jv7/1VPCA/wcBoiIiLtYCFMunT3gvEYGRUoO4YmLF1RhFNSI2DxPfrXPcDXhCXz0yWlIiIiko+FMOnSjFGRMPsY+8f70+I6tNns+Pvlk/HaL2bikUWTkBgeAAEgMTwAyxZlYWF2ouyYRERE0phlByByh16HC2c+9i0233s2gvyN9WPe53DhoU924rvdjXjphukYFR0EAFiYncjCl4iI6AjGvmVGumXxNSErMQyby1tkR/Eop0vBtc9vRF1bDz78zdzDRTARERH9mLFulZGhzD603PLp6bGyo3hEVUs3kiMD8YcLJmBSYhh8fLisCBER0fHwjjDp1oLMOExKCpcdw+0URcF/1uzDoqfz0NrVhynJ4SyCiYiIBoF3hEm30uNCMDY2GA6nC2aTPj/zdfY68Pt3CnGgvRerbp2DiCA/2ZGIiIi8hj6rA6JDbn1jK77e1SA7hls4XQrMPgKTk8Pxzi9nsicwERHRELEQJl3LSgpD3r5m2TFUt6qwBpc9nQc/kw9uOX0M/M0m2ZGIiIi8Dgth0rUfJszpRZ/DhT9/uAOPfb4bf700k2OBiYiIhoFjhEnXMhNCMTk5TDfjhHfXd6CuzYaPbpuLsEBf2XGIiIi8mlAURcqBc3JylPz8fCnHJvI2G/Y3Y0tFK249Y4zsKERERF5HCLFFUZScY7d7/y0yohNYvf0A/vrJTtkxToqiKHjuu/247Y0CZCWGyY5DRESkKyyESfdGRgbiqxLv7Bzx9uYqfFRUi5W3zsa8cTGy4xAREekKxwiT7o2PC0Frdx/q2myID/OOFmN7GzrQY3fh0qmJWJidCIsvu0IQERGpjXeESfd8fAQuzU5CXVuP7CiD8nFRLa54ZgPKm7vgbzaxCCYiInIT3hEmQ7jvogzZEQblqW/24q3NlXj159ORyTHBREREbsU7wmQIbTY7bn19K2R1STmRxo5e2J0unDUhFh/dNpdFMBERkQewECZDCLWYsbm8BZUt3bKj/MimshZc+OT3WLe3CePjQhEe6Cc7EhERkSGoVggLIRYIIUqFEHuFEPeotV8iNQghMCstSnOrzD3//X7c8voW/O2ySTg9PVZ2HCIiIkNRZYywEMIE4CkA5wCoBrBZCPGhoije2byVdCnA14SHPinB0hXFSAgPwJL56ViYneix468sqMHy3FLUWm2ID7fgrvnjIYTAB7fMQXJkoMdyEBER0UFq3RGeDmCvoij7FUXpA/AWgEtU2jfRsK0sqMGqwhp09jqgAKix2rB0RTFWFtR47PhLVxSjxmqDAqDW2oO73y9CVJAfi2AiIiJJ1OoakQig6oi/VwOYodK+iYZteW4pbHbXUdtsdieW55YiLsyC7TVth7dfPi0ZXX0OfFpcd3jbjFFRyEoKw8vryuBwHZxwFx8WgAsmxePrXfXY39h1+LXXzU5FRXMXvi1tPLzt2e/2w2Z3HnX8XocLy3NLPXpXmoiIiP5LrUJY9LPtR9PzhRA3A7gZAEaOHKnSoYlOrNZqG3B7m82OWut/eww7XC70OlxHbevsdQAA6tp7YHcc/NH2Mx98oNLadfTXuxQFtr6jv76xo3dIuYiIiMj9hBrtpIQQswD8WVGU+Yf+vhQAFEVZNtDX5OTkKPn5+cM+NtFgzHnka9T0U3Qmhgdg3T1n6v74RERERiaE2KIoSs6x29UaI7wZwFghxCghhB+AnwL4UKV9Ew3bkvnpCDhmhbYAXxOWzE83xPGJiIjox1QZGqEoikMIcRuAXAAmAC8qirJDjX0TqeGHcbg/dG3wdNcI2ccnIiKiH1NlaMTJ4NAIIiIiIvIEdw+NICIiIiLyKiyEiYiIiMiQWAgTERERkSGxECYiIiIiQ2IhTERERESGxEKYiIiIiAxJWvs0IUQjgAopBweiATRJOrYe8PwND8/f8PD8DQ/P3/Dw/A0Pz9/w8PydvBRFUWKO3SitEJZJCJHfXy85Ghyev+Hh+Rsenr/h4fkbHp6/4eH5Gx6eP/VxaAQRERERGRILYSIiIiIyJKMWws/KDuDleP6Gh+dveHj+hofnb3h4/oaH5294eP5UZsgxwkRERERERr0jTEREREQGp9tCWAixQAhRKoTYK4S4p59/F0KIfx769yIhxFQZObVICJEshPhGCFEihNghhLi9n9ecLoRoE0IUHvpzn4ysWiaEKBdCFB86P/n9/Dt/BgcghEg/4merUAjRLoS445jX8GfwCEKIF4UQDUKI7UdsixRCfCGE2HPofyMG+NrjXi+NYIDzt1wIsevQ7+cHQojwAb72uL/rRjDA+fuzEKLmiN/R8wf4Wv789X/+3j7i3JULIQoH+FrD//wNi6IouvsDwARgH4DRAPwAbAOQccxrzgfwGQABYCaAjbJza+UPgHgAUw/9dwiA3f2cv9MBfCw7q5b/ACgHEH2cf+fP4ODOownAARzsAXnkdv4MHn0+5gGYCmD7EdseBXDPof++B8DfBji/x71eGuHP/7N33+FtlWf/wL+PhiVL3rLjbckZTuI4O8wwEiADSpMwC93jLT8KtKXQMgptWYUCLXQBKaW0L28Hq8wQEiiFBAIJScgeThxLih1PyVuyLVl6fn/YDonjIdtH5znj/lwXF7F0fM4t+ejoPuc8z30P8f4tBWDq+/fDg71/fc8N+1nXw39DvH/3APjxCL9H+98Q79+A538D4OdDPKf7/W88/2n1ivDpACo455Wc8xCA5wGsHLDMSgDP8V6bAaQxxnLlDlSJOOe1nPPP+v7dDuAAgHyxUWkS7YOxuRDAEc65qAY8qsA53wigacDDKwH8b9+//xfAqkF+NZbjpeYN9v5xzt/hnPf0/bgZQIHsganEEPtfLGj/w/DvH2OMAbgawL9kDUontJoI5wOoOuHnapyayMWyjO4xxlwA5gLYMsjTZzHGdjHG3maMzZA1MHXgAN5hjG1njF03yPO0D8bmGgz9BUD74PCyOee1QO8JLoAJgyxD+2Fsvo3eOziDGemzrmc39Q0teXaIoTm0/43sXAD1nPPDQzxP+984aDURZoM8NrA8RizL6BpjLAnAvwHczDlvG/D0Z+i9VT0bwB8AvCZ3fCqwkHM+D8DFAG5kjJ034HnaB0fAGEsAsALAS4M8TfugNGg/HAFj7C4APQD+McQiI33W9eopAJMAzAFQi97b+wPR/jeyazH81WDa/8ZBq4lwNYDCE34uAFAzhmV0izFmRm8S/A/O+SsDn+ect3HOO/r+vRaAmTGWKXOYisY5r+n7fwOAV9F7C/BEtA+O7GIAn3HO6wc+QftgTOr7h9v0/b9hkGVoPxwGY+wbAC4F8BXeNyBzoBg+67rEOa/nnEc451EAf8bg7wvtf8NgjJkAXA7ghaGWof1vfLSaCG8FMIUxVtx3RekaAG8MWOYNAF/vm7l/JoDW/luIetc3HukvAA5wzh8bYpmcvuXAGDsdvfuSX74olY0xZmeMJff/G72TbvYOWIz2wZENeSWE9sGYvAHgG33//gaA1wdZJpbjpS4xxpYDuB3ACs55cIhlYvms69KAOQ+XYfD3hfa/4V0E4CDnvHqwJ2n/Gz+T6ADigXPewxi7CcB69M5IfZZzvo8xdn3f86sBrEXvrP0KAEEA3xIVrwItBPA1AHtOKNfyUwBFwPH370oA32OM9QDoBHDNUFdLdCobwKt9eZoJwD855+toH4wdY8wGYAmA/3fCYye+f7QPnoAx9i/0VtLIZIxVA/gFgF8BeJEx9h0ARwFc1bdsHoBnOOeXDHW8FPEaRBri/bsTgAXAu32f5c2c8+tPfP8wxGddwEsQaoj3bxFjbA56hzp40PdZpv3vVIO9f5zzv2CQORK0/0mLOssRQgghhBBd0urQCEIIIYQQQoZFiTAhhBBCCNElSoQJIYQQQoguUSJMCCGEEEJ0iRJhQgghhBCiS5QIE0IIIYQQXaJEmBBCCCGE6BIlwoQQQgghRJcoESaEEEIIIbpEiTAhhBBCCNElSoQJIYQQQoguUSJMCCGEEEJ0iRJhQgghhBCiS5QIE0IIIYQQXaJEmBBCCCGE6BIlwoQQQgghRJcoESaEEEIIIbpEiTAhhBBCCNElSoQJIYQQQoguUSJMCCGEEEJ0iRJhQgghhBCiS5QIE0IIIYQQXaJEmBBCCCGE6BIlwoQQQgghRJcoESaEEEIIIbpEiTAhhBBCCNElSoQJIYQQQoguUSJMCCGEEEJ0iRJhQgghhBCiS5QIE0IIIYQQXaJEmBBCCCGE6BIlwoQQQgghRJcoESaEEEIIIbpEiTAhhBBCCNElk6gNZ2ZmcpfLJWrzhBBCCCFEJ7Zv3+7jnGcNfFxYIuxyubBt2zZRmyeEEEIIITrBGPMO9jgNjSCEEEIIIbpEiTAhhBBCCNElSoQJIYQQQoguUSJMCCGEEEJ0iRJhQgghhBCiSyMmwoyxZxljDYyxvUM8zxhjv2eMVTDGdjPG5kkfJiGEEEIIIdKKpXza3wD8EcBzQzx/MYApff+dAeCpvv8rzms7juHR9eWoaelEXloifrJsKlbNzaft62T7RCzRf3+9b1800a9f9PZFo9ev7/1P79sfzoiJMOd8I2PMNcwiKwE8xznnADYzxtIYY7mc81qJYpTEazuO4c5X9qAzHAEAHGvpxJ2v7AEAWf4YtH2x2ydiif776337ool+/aK3Lxq9fn3vf3rf/kikaKiRD6DqhJ+r+x5TVCL86Pry43+Efp3hCH659gCWl+XgkXXlxx+fWZCCy+YW4G+b3Dja1AkAsJgNuH35NGyq8OG9Aw3Hl/3G2U4kJhix+oPK44+dPcmBi0qz8Yf3DqM5GAYAvLy9atDtP7zuIGYVpOLvm48ef3zpjGycOdGBh9YeQDjCAQDFmTZ87SwXXt5ejf01bceXvePiaThY14bXdtQcf+zyefmYPCHppNf06o7qQbf/6PpyZCVbxvSaMpMTcMOiyVi3tw6fupuOL3vTBZPREgyd9Jre2HVsyO0r4YNA4muoz99dr+1BQXoiFrgycP+a/eC9uzsmT0jCl88owgtbj6K8ruP479z9henYWd2CNbs+P7xcfVoBCtJteOydQ8cfm1OUhhWz8/DMh5WoaenCC9uODrn9Ba50GA0Mf97oPv7cuVMysXjaBDz+7iG0d/UAAHJSLbjuvEl4a3cttnubjy/7w4umoKGtC//69PPD4CUzc056TUNtXy/7/3B//93VrQCAW5eW4GhTEC9tqz6+zBdn52JWQRp++daB449Ny0nG1acV4h9bvDjSEAAAGBhw96Wl2Oppwtt76o4v++UzCpGVZMVdr+2h959e/0mP9e9/7d09+NqZTry0rQoHatuPP3/nJdOwv6YNr+/8/Lv1ivn5KM6049frPz/WzCpIxaq5+Xj2Izeqm3vzhcQEA36ybBo+OuzDfw82DHv8SbaacOH0bPz+vcNo6ftuzUq24HuLJmHd3lp86v78WPP9CyajKRjCP074bl02IxtnTHTgwbUH0NOfL2TZT3pNw21/SnbSmF5Tv28tdMFiMmD1hs/zhYWTHSe9JqUf/6RIhNkgj/FBF2TsOgDXAUBRUZEEm45dTUvnoI/72rsBAHlp1uOPpdsSAACOJAt6or0vxWLqHU6dZDGdtKzFZITZYDjpsZREMwAgO8WKxAQjAKCt78t0oLrWLljMxpN+P8nS+2fJSbUi0rd9R5KlLzbzScsaGJA44Pdtfds88bH+5HWgmpbOMb+mtL73KTXx5JiMBnbKa/J3hIbcPtG+of7Oge4IbAm9+3teWiJ4XyacYe/dt9JtCSftR0Dv/n3iY4lmIwxs4Ge4d3/NSrYc385Q208wGWBgbMD+/vlnMNna+9l1JPXGlGY7dX+3nvIZPPk1DbV9vez/w/39+983A2ODHMtMYBjwt+3bNxx2CzrTet9Xxljf8sZTjmUGw9B/f72//3p//YHuCDL79qcM+8nHGoahjjUnHyvSTjjWRPnJ+UKytfe7dbjjT7K19/dzUqzHv7v7v1tTBny3GgwMFtPJ3832vnwh94R8YeBrGm77Y31N/cxGA8zGk2Ma+JqU/vlj/V88wy7UOzRiDee8bJDn/gTgA875v/p+LgewaKShEQsWLOBytlhe+Kv/4tggb3p+WiI23XEBbV/j2ydiif776337ool+/aK3Lxq9fn3vf3rffj/G2HbO+YKBj0tRPu0NAF/vqx5xJoBWpY0PBoCfLJuKRLPxpMcSzUb8ZNlU2r4Otk/E6v37n3y40dP+J3r7ool+/aK3Lxq9fn3vf3rf/khGHBrBGPsXgEUAMhlj1QB+AcAMAJzz1QDWArgEQAWAIIBvxSvY8egfhyJq1iJtX+z2iVir5uajORg6PmZWb/tf/3YeWXcQNa1dyEuz4rZl03Sz/yvl/X90fTmOtXQiJ8WKOy7W3/v/45d2IRLlyNXp/nfby7sRjkR1e/zR6/ZHEtPQiHiQe2gEUYaucASrNxzBzReViA6FyKwlGMLHR/y4ZGau6FCIAE2BEF7YWoXvLZokNI6rVn+MW5ZMxVmTHELjkFskyjH95+uwcJIDVy8oxMU6/By+vvMYFpVMQGrfGFiiL/EcGkFIzBKMBvxpQyXauwafvEe0y2o2YvmMHNFhCPf2nlocqm8feUGNOVzfjv8cqBcdBpaW5sBsHGyOt7bVtHQi056AKdnJcPsDosORXTTK8YWZuZQEk1NQIkxkZTAwOB02eP1B0aEQmT3+7iGs3nhEdBjCfVThwydH/KLDkJ3HH4DLYRcdBr573kQscGWIDkN2dosJP/9iKVwOO7w+/R1/99e2YeUTm0SHQRSIEmEiO6fDBo8Or0jonccfgDNDfCIkmsth1+X+7/EH4XLYRIeBz44246G3D4y8oMbYEoxYNiMHswpSUZylv8+hxx9AYbr4/Y8ojxR1hAkZlXtXlB2v00r0w+MLwpVJX0SuTDs+PuITHYbsrj9/EkTNSTlRgtGADeWNuPPi6aJDkdUj68qRm2rFd8+biLL8VNHhyM7jC8CVqb8TADIyuiJMZJdgMqCioWPkBYmmzHOmK+LWuGhnTXLgvpWnlGTXvH3HWmEdUEJJBFemHV5/ENGo+KRcTl5/AEV9V+S/8sxmBEODN3nSqgkpVpxenC46DKJAlAgT2ZXXteP+NftFh0Fk9tDlM493QdKzJIsJ9W1d6IlERYciG845/ue5bQgp4DUnWUzITbOiKTh4t0utcvsDKO67ItrY3g2PzsYJX72gEBdMyxYdBlEgSoSJ7Ioz7fDQZDld2e5txj1v7BMdhmL88PmdqGnpEh2GbBrau5FoNiLFqowZ+/+9dREy+9rW68UCZzqKMnqvCDsddnh1Nk79m3/9FG1UrYgMghJhIrsJyRZ0dPWgo1tft+b07FB9OwL09z7O6bDpqoSVxxeAUwET5fptONSIrZ4m0WHI6pErZx8fmjItJxktnfpJCtu7wthS2YRkuiNFBkGJMJGdwcDwqytmQn+VPPWLJqqczJVph8enn0S4MMOmqCY6e6pbFFHTWC6fuptw35ufD0e7delUXHt6kcCI5OX1B+F02MAYfeuQU1EiTIT44qw8GA10UNKLznAEk7KSRIehGFfMy8fcojTRYcgmzWbGuVMyRYdxnN5ORMrr2tAZ/vyOTF1rF/62yS0wInn5OroxPTdFdBhEoSgRJkI8sr4cf/lIPwdivbtvZRmWl1FXuX7znRko1dEX849f2oU1u2tFh3Gcy2HXVVOf3hrOn9+RiXCOpzbop7nNoqkT8PiX5ogOgygUJcJECKfDpqsrMnoWjXL86u2DuitXNZwjjR1Y9tuNosOQjdsXVFTpvCnZSXjqq/NFhyGbznAEkyd8fkcmN8WKlmBYNyXUXt95TJdtzUlsKBEmQlB3Of2ob+/Cy9urYaChMMflpyWiqrlTFyXUOOfw+gNwKqiZisVkRFtnWDcTdh+8bCYunP556TCDgaEoQz+t7v++2YumgL7K5ZHYUSJMhJg8IQmzCvQzRlLPPL4gihWUBCmB1WxEVpJFFyXUusJRrJqbr5jSaf3uX7Mfe4+1ig4j7iJRjofXHTylq99fv3WabsbtK+2OBFEWSoSJEBOSrfjZpaWiwyAy8PoD9CU0iJVz8hTRYCLeEhOMePCymaLDOEVvhznt35WqaenEazuODVox4WiT9l9/R3cPAt09yE7RV91oEjtKhIkwP35pF8rraNyW1q2Yk4fblk8THYbi3LZ82knjNrXqrd21eOL9CtFhnMLlsMGtg+5qniFORDccasSfN2p/wnKi2Yi1PzyXSqeRIVEiTIRp6wyjoqFDdBgkzg7UtiHBSIeagd7dX48/b6wUHUbc7a1pVeREySWlOVg0NUt0GHHn8QfhGmRoUrHDrot5GrWtnYhy5e1/RDno24kI09tqWfsHYr2769W9qGrW/pW30eKc45NKv+gw4q53opzyhsZMzUnGvKJ00WHE3eVz83Hr0qmnPO7UyfH39Z01eHFblegwiIJRIkyEmZKdTG13NS4a5fD6g9RVbhB6aeoQjnBMVODfP9Ddg3n3v3vKJDKtOVDbBvMgd2RyU6y4ZUmJ5l+/20dzFMjwKBEmwlw5v4DGjmpcQ3s37BYTkiwm0aEoTlGGDYFQjyKHDUjpz19fgLL8VNFhnMJuMcFqNqChvVt0KHF1+793o7a185THDQaGK+YVIBzR9v5Hk3XJSCgRJsJ0hSN47N1DosMgcZRoNuKBVWWiw1Akq9mILT+9SNP1lZsCIUVOlOvnctjh1vBV+UiUo6q5E86MwRPBG/7xGd47UC9zVPL6xtkuTM9NFh0GUTBKhIkwCUYDnt54hIZHaFiCyYClpdkjL6hTb+6q0XTllIqGDkUnWsvLcgYdNqAVta2dyLAlIDHBOOjzvY2NtDt+PxLlWDYjB2m2BNGhEAXT7hGAKJ7BwODM0MeEDb367XuH8NSGI6LDUKyPj/ixxa3dCXNDle5Siv85dyLmO7U7YS7JYsK9K2cM+bzToe1x6gfr2rDij5tEh0EUjhJhIpTToZ82n3rk8QXgdFBXuaEUZ9rg0XAtW48voOiJktu9TXhw7QHRYcSNxWTEkulD35GZU5im6VrWHl8QRRmJosMgCkczWIhQD6wqQ0qislqvEul4/dTadDhOhx1bKptEhxE331s0CVEFN8+zmIzYeKgRP71kuuhQ4uI375QjK9mC/3f+pEGfL8tPVeRERql4/Mo+ESPKQFeEiVAGA9P0GEm9O82VQV9Ew1g4ORP3aXgy4a6qVljMyv2acTpsONoU1GwJMY8/AOcwJ6Kcc1z9p08QDGlznkZOihVnFjtEh0EUTrlHKKILh+ra8cu3tHtrUu/uX1VGpdOGkWQxoaopiIgGS6hxzvH//m8bunuUe0k42WpGbqoVzcGw6FDiYqiucv0YY2gOhHC0SZvDc66YX4DF0yaIDoMoHCXCRCiXTrob6dFnR5tx92t7RIeheLe8sBM1LafWeVW7xo5uWMxGpCp86NN7ty5Chl2bVQVOL84YsnRaPy1PmPvGs5+itVObJzlEOpQIE6FyUqxo6wpr9tacnh2qa0dXWLlXA5XClanNWrYeXxAuFUyUfL+8AVs92hyn/eBlM4csndavNDdZk8liR3cPtrj9SKY7UmQEtIcQoQwGhkevnC06DBIHHr86EiHRnA47vP4AgCzRoUiqMCMRtyyZKjqMEe071opAKILTXBmiQ5HUVk8T1uyqwb0rhx+DfstS5f+NxsLrD8CZYdd0wxoiDboiTIS7ZGYuDIwOVlrTFY5g8gTq6DSSK+cXYG6R9mrZJlvNOHuS8icqaXVowMG69pjGZ9e2duLZj9wyRCQvf0cIpXkposMgKkCJMBHukXUH8ewm7R2I9e6eFTOwvCxHdBiKN9+ZjpJs7Z0w3P7ybry5u0Z0GCPSaptlr2/4ihH9IlGOpzdWyhCRvM4rycLjX5ojOgyiApQIE+G0ekVGzzjneHDtAUQ1WA1BahUN7bj4dxtFhyE5t0/ZXeX6leQk4emvLRAdhuS6e6KYEkOzjLzURDQHQ+gMRWSISj6v7qjGwbo20WEQFaBEmAjnytR2v3s9qm/rxiufHaPxeTEoSLehqrlTUyXUOOfwKry9cj+LyYjGjm50dGtrwu79q8pwUenQXeX6GQwMhRk2eJu0dTHiX1uq0BQIiQ6DqAAlwkS4yROSMLcwTXQYREIef4AmysXIajbCYU/QVAm17p4oVs3NR6pN2aXT+j249gD2HWsVHYZkotHeOzKxNgp57tunY1KWtlotu/0BFFMzHxIDSoSJcBOSrbhToy1O9coT4/hE0uvyefkIR7RTas5qNuKXl80UHUbMnA4bvBq6K1XT2ok3dtaAxTgJORLlmhonHejuQXtXGNnJVtGhEBWIKRFmjC1njJUzxioYY3cM8nwqY+xNxtguxtg+xti3pA+VaNnNz+/AoXpqtawVK+fk46eXTBMdhmr8ZNk0TNTQFbm1e2rx+/cOiw4jZsUOO9waauzj9QfhHMUdmQ8ONWqqcoTVbMQ7N59PQ7NITEZMhBljRgBPALgYQCmAaxljpQMWuxHAfs75bACLAPyGMabNVj0kLgKhCCoaOkSHQSSyr6aVSuKNwrq9dXh64xHRYUhmX00rYrwrrwhLZ+TgAg214nX7RjcsoNihrQ6fta2dCEW0NfmPxE8sV4RPB1DBOa/knIcAPA9g5YBlOIBk1nsfJglAEwBtzTwgcVVMrZY15e7X9uKYhsa8xhtjwKdu7XQ38/iCcGWqZ4z41JxkzCpIFR2GZK6YV4CfLIu9UYYrU1tDQ17fWYOXtlWLDoOoRCyJcD6AqhN+ru577ER/BDAdQA2APQB+yDnXzoA3EndTJiRprnyPXvVWDBjdrVm901ot20iUq2ryVUd3D+bd927Mk8uUbs+xVpgMsU8Byk1NxK1Lp2rm9Xv9AbiJ9kHiAAAgAElEQVRoohyJUSyflMHubw78tCwDsBNAHoA5AP7IGDulpQtj7DrG2DbG2LbGxsZRB0u066oFhbhVo60+9aahvRt2ixHJVnVUDFACp8OGrnBUM4nI6q/NR1m+eq6wJllMsJqNaGzvFh2KJH766h7UtsV+R8ZoYFgxOw/hiDb2P4+PTsRJ7GJJhKsBFJ7wcwF6r/ye6FsAXuG9KgC4AZwyU4Zz/jTnfAHnfEFWVtZYYyYa1BmK4Nfry0WHQSRgNRvxoIoqBiiB1WzEpjsuiHmWv5I1B0L43X/UM1GunyvTrol65pEoR1VTEEUZo0sEb/jHZ/jvwYY4RSWvby10oTSX2iuT2MSSCG8FMIUxVtw3Ae4aAG8MWOYogAsBgDGWDWAqAO31bCRxYzEZ8OcPKxEM0dBytTMbmaYmHsnl9Z3HUF6n/sopFY0d+OCQ+hKqS2bmwmxU/4lIbWsn0mxm2BJMo/o9l8OmiXkakSjHBdMnIM1G8/VJbEZMhDnnPQBuArAewAEAL3LO9zHGrmeMXd+32P0AzmaM7QHwHoDbOee+eAVNtMdgYCjK0NaEDb36w38rsHqDdiogyGVzpR+fetQ/YU4trZUH+s45xZhblC46jHFLtpjxwKrR35FxZtrh1UAifLCuDSv+sEl0GERFYjpl5JyvBbB2wGOrT/h3DYCl0oZG9MaVaYfHF8B0uqWlah5fAJfMzBUdhuo4Hb37v9qppbXyQJ+6m/Du/jrc9YWB1UHVxWwa2x2ZOQVpCPWof4671x9EEY0PJqMwunsnhMTRg5fNRLKVdkm1U+sVQdFcDju2aqCE2g2LJqMnqr5JV1azAR9V+EWHMW6Pv3sIGXYLvrdo0qh+b2ZBKmZqoITcaGsoE0ItlomiHKhtEx0CGaczJzpUVUNWKc6ZkokHLisTHca4bfM2q3KsrdPROzRA7ZU7PP4gXGO4Iso5xxVPfaz6Mpb5aYk4a6JDdBhERSgRJopxuL4dD719UHQYZJzuWTGDSqeNQZLFhMrGACIqvJraj3OOG/6+HeEe9b2G1EQz8tIS0RIMiw5lXDy+sdXQZYyhJRjC0SZ1z9NYNTcfi2myLhkFSoSJYmhlsoaefXa0GXe+slt0GKr145d2oUbFHfl8HSEkmAxItanzROg/t5yPdLu6qw2cNckx5hq6Wujw+bW/bEFLMCQ6DKIilAgTxchNsaIlGKYSaip2uL4d3RqYcCOK06HuyilefwBOFY8Pf+9APbaqvHLHfSvLRl06rV9pbgrau9R7/A2GerDV04QUuiNFRoESYaIYBgPD41+aIzoMMg4efxDFKk6ERCvOtMOt4ityhRk23LZMvR0i99W04X0VN5XY5mnC3a/tGfPv37J0Kq6cXyBhRPLy+HobiRgM6hujTsShRJgoypLSbLBBu3oTNQj3RDElO0l0GKp11YJCzCtKEx3GmNkSjDhDxROVXJl2VV+RL69vH9f47GMtnXjmQ/X2wmoOhlTV2psoAyXCRFEeWXcQf/vYIzoMMkZ3X1qK5WVUQ3is5hWlY1KWek8k7nhlD9bsrhEdxpi5HDa4VVzL2eMLwDmOii3RKMdfPnJLGJG8Fk7OxGNX011FMjqUCBNF6S9hRNSHc44H1uxXddUD0Q7Xt+PSP3wkOowxU2szjX7TclLw9Nfniw5jzMIRjikTksf8+3lpiWgKhNAVVmcJtVc+q8b+GirBSUaHEmGiKMWZdlVfkdGzxvZuvLrjGIw0Pm/MCtJtqGoKqvJkgnMOjy+o6kQ4wWRAbWsXOrrVOWHsnhUzsKQ0e8y/bzQwFKQnqnZ4yPNbq9BMFSPIKFEiTBRlyoQkzHemiw6DjIF7jPVLyecSE4xItyWosoRad08Ul83NV23ptH4PrT2gyquK0SjH/Wv2IzrOk6h//M+ZmJilzs/xWGsoE32jRJgoyoQUK25bPk10GGQMvP7gmOuXks9dtaBApS2Kjbh/lfo747kc6qylW9vWhTd31Yy7YkJ3TwSVjep7/cFQD1o7w8hNsYoOhagMJcJEcb7/rx04XN8uOgwySivm5OHuL5SKDkP1bl06FcUqvKr11u5aPP7uIdFhjJsr0w6PCodneSW6GrrxUCP+9rH6JsxZTUb855bzqXQaGTVKhInidIYiONLYIToMMkq7qlpEh6AJa/fU4k8bjogOY9QO1LaBaSAHWV6Wgwunq69Fr8cfhEuCOzJOhx0en/rGCB9r6UQwpM5JfkQsSoSJ4vSWMFLfgVjv7nlzP6qb6e82XgYGbPU0iw5j1DwqrxjRryQ7GaW56qtFe/m8fNx58fRxr0etbZbf3F2Dl7dXiQ6DqBAlwkRxpuYko7uHzuzVhHOu+va6SuFSaSLCAVXXQO7X1hXGggfeBefqGqe9U6I7Mnlpibhtufq6A3p9QZooR8aEEmGiOFctKMTNF5WIDoOMQmN7N6xmI1IT1V0xQAmcGXaEI1HVJWJPfHkeZhao70rqQClWMyxmIxo7ukWHMio/f30valu7xr0eo4Hh4rJc1V2M8PgD1N6djAklwkRxgqEePLzuoOgwyChYE4x45IpZosPQhMQEIzb8ZDGYigbctgRDeOydctFhSMbpsKmqlm40yuH1B+EaR1e5E934j8/wQXmjJOuSy7fPKUZpXoroMIgKUSJMFMdiMuLZj9zopIkPqmFkDOdPzRIdhma8uqMa5XXqqZxypLEDGw/7RIchmS/OykOCUT1fj3VtXUhNNMOWYJJkfWrr8BmJcpxfkoU0W4LoUIgKqeeTTnTDaGAozLDB26SeA7HePfF+BZ76QH2VDpRqS2UTtnqaRIcRM7dPmooFSvHtc4oxuzBNdBgxs1tMeOjymZKtrzhTXROWD9W3Y8Uf1duanIhFiTBRJJdKS/jolcdPHZ2k5MpU1xU5rXX02lLpxwNr9osOI2ZGA8N5JdLdkZlblI5pOcmSrS/ePD6aqEvGTpr7KIRI7OErZiLJSrunWng0dkVQNJfDhm0qKqF24+LJCEejosOQTGKCEZ9U+kWHEbPfv3cYqYlm3Lh4siTrK8tPRVm+eiY+SlVDmegTXREmihSJcuw91iY6DBKjhZMdquyGplTnTsnCg5epp13xZrcfJg119OptKhFQTeUOty8g6eePc45VT2xCV1gd8zTy0xNx9qRM0WEQlaJEmCjSofoOPLqeKkeoxV1fKEWylUqnScVuMeFgXTsiUeUnYpxz/OCfOxDq0c4V4dREMwozbGjr7BEdSkx6a3hLd0WUMYa2rjCONqljeNqK2XlYPE193QCJMlAiTBTJlWmjMcIqseNoM257eZfoMDTnJy/vQm1rp+gwRuQPhGAwMM3N2F9383lItanj5G7h5EzJu/q5HHa4feoYp/7VZ7agORASHQZRKUqEiSLlpiaiORiiEmoqcLihAz0quHKpNi6HXRW1bLU2Ua7fO/vq8KlbHZU7fvHFGbBbpJ1TUZaXgo4u5V8RD4Z6sNXTRM18yJhRIkwUyWhg+N01c0SHQWLg8QUkvxpF1HNFrshhw+0qbMk7kgO17dhwqEF0GCPa5mnCna/skXy9tyydiivmF0i+Xql5/UEUZthg0NAYdSIvSoSJYl0wLRscdKVR6SJRjpLsJNFhaM41pxdivjNddBgjspiMON2VIToMyalleNbhhg5E4lCxo7o5iGc+rJR8vVJrDoYwSwOtvYk4lAgTxXp43UE894lXdBhkBHdeMh3Ly3JFh6E5c4vSVXGl/e7X9mLN7lrRYUjO5bDDo4JazvGqoRuNAs9+5JZ8vVI7e1ImHrua7h6SsaNEmCiWK7O3hBFRLs457nljH3oi2qkYoBTlderoltWbiGmvhuv03BQ8840FosMYUU+UoyRb+uYXeWlW+AIhxZdQ+/f2auyraRUdBlExSoSJYrkcNlVckdGzxo5uvLGrBiYjHUqkVpiRiKNNQUQVPBGRcw6PxDVslSLBZIDXH0RHt7InjP3s0lIsKc2WfL0mowEF6YmoUngJtRe3VaElGBYdBlEx+vYiijU1O1mTYw+1xOsPavJqoBLYEkxIs5lR29YlOpQhhSJRXDG/QHOl0/o9vO4gDtYqt7FPNNp7RyZeJ0vPX3em4k9y6BhExosSYaJYE1KsuGWp9maja4nbF0CxCsaxqtWXTitS9LATi8mIe1bMEB1G3Ci9ckd9exfW7qmNW8WEQHcEFY0dcVm3FDpDETQHQ8hLTRQdClExSoSJot3wj+2oaGgXHQYZwso5efj5F0tFh6FZtywpictEKKm8tbsWj71TLjqMuFF6LWd3nEsXfni4UdETli0mA97/8SIqnUbGhRJhomihnigqGpR7RUbvPvO2qKINsFqt2V2D1RuOiA5jSAfr2sCYdpOQS2bm4MLpym3d6/HFd1iAy6HsCcvHWjrR2knjg8n4UCJMFM3psMNLE+YU64G39uNYi/LbAKuVkTFs9zaLDmNIHn8Qrkztjs+ckp0cl4oMUrlifj7u+sL0uK1f6VfE1+yuxb+3V4sOg6hcTIkwY2w5Y6ycMVbBGLtjiGUWMcZ2Msb2McY2SBsm0atpOckI9Sh3jKSe9VcMcGYo99a92im9hKCBAZOytNtMpbUzjDMefA+cK/Oux3ZvM+J5QyYvzYrbL54Wvw2Mk9cfgFPhk/mI8o2YCDPGjACeAHAxgFIA1zLGSgcskwbgSQArOOczAFwVh1iJDl21oBDfv3CK6DDIIBo7upFgMiDVZhYdimY5HTZEolyxidjvrpmLWQVposOIm9REM8xGBl9HSHQog7r3jf2obY3fHRmT0YAl07MVW0uYJusSKcRyRfh0ABWc80rOeQjA8wBWDljmywBe4ZwfBQDOufIbtBNVCHT34KG3D4gOgwwi0WzEb66eLToMTbMlmPDfHy9S5DjclmAIj6w7KDqMuFPq8KxolMPbFJ+ucie64R/bsfFQY1y3MVbfPXciyvJTRIdBVC6WRDgfQNUJP1f3PXaiEgDpjLEPGGPbGWNflypAom9WsxF/2+RBZ0iZVyT0buHkTNEhaN5L26pQXqe8yilHGgPYVOETHUbcrZyTB4vJKDqMU9S3dyHZakaSxRTX7bgyldlqOhLlOGuSQ7M1rIl8YkmEB7sUMfA+nQnAfABfALAMwM8YYyWnrIix6xhj2xhj2xoblXmGSZTFaGAoSO/tsEWUZfWGI1j9QaXoMDRvm6cZ27xNosM4hccXgEsH4zO/tbAYMwtSRYdxCrvFhEeumBX37bgcdngUOGHucIM6WpAT5YslEa4GUHjCzwUAagZZZh3nPMA59wHYCOCUe6ac86c55ws45wuysrLGGjPRGaUXtdcrj0/bFQOUwplpU+TMfa8//rflleDjIz7c9+Z+0WGcggE4e7Ij7tuZ70zH9FzlDT/w+IKK73pH1CGWeypbAUxhjBUDOAbgGvSOCT7R6wD+yBgzAUgAcAaAx6UMlOjXo1fNjvvtPzJ68S7mT3oVO+x45egx0WGc4obFkxFWcNc7qdgSTPjU4xcdxin++H4FUqxm3Lh4cly3U5afirJ85V0R9/jp+EOkMeIVYc55D4CbAKwHcADAi5zzfYyx6xlj1/ctcwDAOgC7AXwK4BnO+d74hU30JByJYnd1i+gwyADnlmTq4ta4aOeVZOGhy2eKDuMUmyp8MChwEp/Uih12eHxBxVXu8Mh0Iso5x4o/fqS4yhEF6YlYOIXmKJDxi6mOMOd8Lee8hHM+iXP+y77HVnPOV5+wzKOc81LOeRnn/LfxCpjoz6H6dvzmnUOiwyAD3HnxdKQmUum0eLNbTNhT3Yqogjr4cc5x8ws7dVHjO9VmRkF6Itq7e0SHchK5hiYxxtDR1YMqhc3TuHRWHhZPVW7XP6Ie1FmOKJ5LoeWL9GxnVQtueXGn6DB04/Z/70ZdW5foMI5rDobBAKTppIb0upvPQ4pVWa/1vJJM2YYGOB02xU2Y+/KfN6MpoMz6zkRdKBEmipeXlgh/IKS4W3N6dri+HQq7U6xpSusw5/YFUJxpV2R943hYt7cOn7qVVbnjri+Uwi7T3IlZBWkIhpRzRbwzFMF2bzPdkSKSoESYKJ7RwPCHa+eKDoOcgCaqyMulsCtyRRk23HnJdNFhyOZgXZuimkps8zThtpd3yba9Hy0pwco5A9sHiONtCqAwwwajQR8nYiS+KBEmqnBeSRYiChojqXdRDkzNSRIdhm58+Qwn5jvTRYdxnNnIMK9IOfHEW28tXeVckT/c0AE5D4dVTUE8vfGIfBscQUswjDmF2m3tTeRFiTBRhUfXl+Pvm72iwyB9bl8+DcvLckWHoRuzC1KRn54oOozjfvb6PqzZPbCcvHb1jpFVTiLs6RuaIpco5/jfj5Vz/D1zogO/vorauxNpUCJMVEFpt4b1jHOOX7y+Vxc1ZJXiQG07Ln9yk+gwjvP69dFVrt+MvFQ8+83TRIdxHAdQkp0s2/by0xLR2N6tmHkaL2+vxt5jraLDIBpBiTBRBadDWZOF9MzXEcLru2pgNtLhQy5Ohw1Hm4KKKKHGOdddM5UEkwGH6zvQoZASaj+9ZDqWlGbLtj2T0YD89ETFlFB7eXsVmoNUMYJIg77JiCpMzUnGGRMzRIdB0Hc1UEdJkBLYLSakWM2KKKEWjnBcNb8Q6TopndbvkfXlKK9rEx0GOOf4+et7ZZ8z8dL1Z2FiljLmBXj9QToGEclQIkxUITvFipsvKhEdBkF/a+X4F/InJ7v29CJFTBhNMBnw8y+W6qZ0Wr9ihw1un/grovVt3Vi7p072igmtnWEcqm+XdZuD6QpH4A+EkJemnDHzRN0oESaqcd1z21DRIP5ArHer5ubj3hVlosPQnR8tKUFhhvgTkLd21+KRdQdFhyE7p0Ia+3j8ARTL0FFuoI8O+xQxYdliMuDD2xZT6TQiGUqEiWr0RDmONIr/ItK7rZ4mhGiinOxe33kMqzeIL2FVXt8Okw7Hh186KxcXTZdvXO5QPL4AnAKGBTgdNngVMGG5qqkTje3dosMgGqK/oxlRLRdNmFOEX751AMdaOkWHoTtmowGfeZtFhwGPTofGTJ6QhOIs8eNSL59XgJ9dWir7dosz7XAr4Pj79t5avLrjmOgwiIZQIkxUY3puMnoUMEZSzzjn8PqDKKaJKrJzOeyKuCJnMjJMnqCMSVNyau0MY+FD/wUX3Ft8m6cJPQLuyOSnJeKuL4jvJujRWek+En+UCBPVuGpBIW5cPFl0GLrmD4RgMjKk6qxigBI4HTZEOReeiD129RzMKtBfV680WwKMRoamgNiyXfet2Y/aVvmrh5iMBpxXkiW8lrDHF9TlHQkSP5QIE9Xo6O7BQ2sPiA5D16xmIx7/0hzRYeiS3WLCu7ecL7RaQ2swrOvPoFNwq+X+OzKiroh+/5+f4cPDPiHb7nfd+RMxMz9VaAxEWygRJqphNRnw1489wq9I6FmUc5w10SE6DN16YetRlNeJq5xyxNeBTyr9wrYv2mVz8mAxGYVtv76tG3aLCUkWk5Dti66cEYlyzHemI82WICwGoj2UCBPVMBkNKEhPxFGFdDfSo6c3VCqicoFebfM0Y7vACXOiKhYoxTcXFqNM4NVIu8WIX181S9j2XQ6b0AlzFQ0dWPWEclqNE22gRJioClWOEKu3hql+EyHRXJlir8h5/EEU63h85qYKH+59c5+w7Uc5cKbAOzILXBmYkSfuRMDjD9BEXSI5MfdXCBmjx66eLey2IOn9ItLzFUHRXA47Xt8prnTUTYsn67qGtC3BiG0ecVfkn/ygAskWE266YIqQ7Zflpwq9Iu6l4w+JA7oiTFSlMxzBjqoW0WHo1vklWXRFWKDF07Lw8BXibo1vONQobNtK0H9HSlTlDq9P3EQ5oHey3sW/+xDdPWLmaRRl2HBeSaaQbRPtokSYqMqh+g48/u4h0WHo1k+WTUNqIpVOEyXRbMR2bzOigupp//ilXQj16PeKcLo9AQUZNnR09wjZvscfgEvgFVHGGDpDPagSNE9jeVkuFk2dIGTbRLsoESaqUkxjhIXZcbQZNz+/Q3QYusYYw52v7kF9u/x1ZJsDIUQ5R7rOa0i//cNzkWwV8x4smjpBeDMJV6YdHp+YRPiapz+Br4PaKxNpUSJMVCUvzQpfR4hKqAlwpJFOQJSg92RQ/kSkf6KkyDrGSrB2Ty22CCohd8fF04TPkZhdkIaggONvVziCz462IJ1KpxGJUSJMVMVkNODJr8wTHYYu0UQVZXA6bEKaOhRl2HD3F0pl367SHKxrx6YK+ZtKbPc24dYXd8m+3YF+tKQEK2bnyb7do01BFKQnwmjQ94kYkR4lwkR1zp7sQI+gMZJ6Nz03WXQIuvfVM504zZUu+3YZY5hVQB29ijNtcPvlvyJf0dAh+zYHc9QfxJ8E1BJvCYYxv0j+/Z5oHyXCRHUeXV+Of27xig5Dd25dOhXLy3JFh6F7swpSMSHFKvt2731zH9buqZV9u0rjEtRdze0LojhTfA3nKOf4v83yH39PL87Ao1fNln27RPsoESaqU5xph0fAFRk945zjZ6/tRVjHNWSVYn9tG6566hPZt6v3rnL9ZuSl4q/fPE327TIGTM1JkX27AxWkJ6KhvVv2EmovbqvCLiqdSeKAEmGiOqL73etRUyCEN3fXwGykQ4ZoTocd3qaA7CXUPP4gXDruKtcvwWTA/to22Uuo3b58GpaUZsu6zcGYjAbkpVpR1dQp63Zf/ewYWjvDsm6T6AN9qxHVmZaTjLMEthnVI+oopxxJFhOSrWZZS6iFI1FcNb8AGXaasQ8Av15fjvK6dtm2xznHXa/uQY9C7si8csNCTJS5jJtXcA1lol2UCBPVyU6xCmsxqlduXxDFdDVQMb5yRhF6IvJdETYbDbj70lLdl07r11tLV767Ug3t3Vi/rw4mhdyRaQp046CMJwJd4Qh8gRDy0uQfG0+0TxmfKkJG6Tt/26qYWdR6sGpOHu5bVSY6DNLn5otKUJgh34nJW7tr8dDbB2TbntLJPTxLaeOzPzzswz8/lW/CnMVkwKbbL1DMiQDRFtqriCpFOUdlIyXCctnibqImJgry2o5jeOoD+UpYHapvRwIlIcetmJ2LpTNyZNue6NbKA8ndXa6qqRN1rfJ3UyT6QEc2okquTDu8VDlCNr96+yCONcs7OYYMzWw0YGdVs2zbU1oiJtqkrCQUpCfKtr0r5hXgFyuU08zE5bDL2tRl3b5avLrjmGzbI/pCiTBRpRl5qYhwaqohB845PD5KhJTE6bDJeiJoMRkweUKSbNtTuuZgGOc+8j64TMegzZVN6A4rY6Ic0FtCTc4ugx5/EC4F1FAm2kSJMFGlK+cX4PrzJ4kOQxeaAiEYDAzpVDFAMVx9M/blSsQeuXI2ZhemybItNUi3mcHQmxDL4ZdrD6C+TTlDA8xGA86a5JBtuBSdiJN4okSYqFJ7VxgPrNkvOgxdsJqN+P21c0WHQU6QZDFh3c3nyVLFobWTPmsDMcb6GvvEf3gA5xxefwBOhVVt+cG/dmBThU+WbV1//iRq703iJqZEmDG2nDFWzhirYIzdMcxypzHGIoyxK6ULkZBTJZqNeO4TL03gkkFPlOM0V7roMMgA/9xyVJZatpWNHdjibor7dtTm8nkFsJqMcd9OY3s3bAlGJFvNcd/WaBRn2uGWoYRcTySKWQWpSLPRHSkSHyMmwowxI4AnAFwMoBTAtYyxUwYH9S33MID1UgdJyEAmowH56YmobqYJc/H2lw8r8acNlaLDIAPsONqMHUfjP2HO6w8eH4pBPveNs10ozYt/y2ObxYTHrp4T9+2Mllzj1N2+AC5/6uO4b4foVyxXhE8HUME5r+SchwA8D2DlIMt9H8C/ATRIGB8hQ3I5bHDLWMJHr9w0UUWRXJl2uGW4Ne/2Bai18iA+PNyIe9/cF/ftRCIcCxR4R+Y0VwbK8uN/IuCm8cEkzkwxLJMPoOqEn6sBnHHiAoyxfACXAbgAwGmSRUfIMH57zVwkWWLZhcl49LY2dYkOgwzgctjx5q6auG/n+xdMRkghrX2VxG4xYbs3/lfkV288ApvZiO9fqKxummX5qSjLj/+4XY8Cx0cTbYnlivBgszEGTlX+LYDbOefDDthkjF3HGNvGGNvW2NgYa4yEDCrQ3YNtHhq7GG+LSrIwMZNKZynNBdMm4OErZsV9O+8dbEAkSqUKB3I5esfIxrtyh8cXgFOBQ1OiUY5lj29Ed09852k4HXacX5IV120QfYslEa4GUHjCzwUABl6GWADgecaYB8CVAJ5kjK0auCLO+dOc8wWc8wVZWbRjk/E53NCBP/y3QnQYmnfL0qlItSlrog4BrGYDPqn0IxrnJPW2l3eju4euCA+UbjOjMN2GQCi+iaDHH0SxAocGGAwM3T0RVDXFt9HOshk5WDR1Qly3QfQtlkR4K4ApjLFixlgCgGsAvHHiApzzYs65i3PuAvAygBs4569JHi0hJ+gdIyxfdyM92lnVgpv++ZnoMMggGGO4+7U9aGjvjts2WoIhRKMcDqohfQrGGNb+8Ny4D8+6cNoExY7Rdzrs8MZ5nPrVf/oEDe3KqaFMtGfERJhz3gPgJvRWgzgA4EXO+T7G2PWMsevjHSAhQ8lPS0RjRzeVUIujIw0dMBriX6uWjE3/7fl4cfsCcGbaZKlXrEZv7qrB5kp/XLfx42VTFVc6rd+cwjR0xvH42xWOYGdVCzKodBqJo5hOZTnnawGsHfDY6iGW/eb4wyJkZCajAau/Ok90GJrWW8hfebdlSS9XZu8VubMmOeKyfqfDjnu+OCMu69aCw/XtONzQgTMnxuf93+5txnOfePC7a5TZ0OZHS0riuv6qpiAK0hJhMlLvLxI/tHcRVTu92IEwzWiPG8YYSnOTRYdBhvD1s5w4rTgjbuvnnMtSGUCt+k9E4kXpd2Q8vgCe/CB+8zRaO8OKLB1HtIUSYaJqv15fjhe2Vo28IBmTHy0pwcNtJZIAACAASURBVPKyXNFhkCGU5aUi026J2/rvX7Mfa3bXxm39aud02OGJ49AUjz+gyIly/TiAf316NG7rX+DKwCNXzo7b+gkBKBEmKkcT5uKHc467Xt0T9/JIZOz217bhS09/Erf1e/xBFCt0opYSzMxPxf9++/S4rd9oYJiWG/+mFWNVkJ6I+tZuhOJUVeTFrVXYWdUSl3UT0o8SYaJqrkw7PDJ019Kj5mAYb+6qQQKNz1Os3lvzwbjVsvXQGPFhJZgM2FHVgkB3T1zWf+vSqVhSmh2XdUvBbDQgN82Kqji1un991zG0dobjsm5C+tE3HFG1aTkpWDg5U3QYmuT2BVCcaaeKAQqWZDHBbjHFpYRaTySKqxcUUum0ETz+7iGU17dLvl7OOe58ZQ96FD4H4o0bz8HEODX88PiUWUOZaAslwkTVclKtuGHRZNFhaBJVjFCHr5/lRE8cmmqYjAb89JLpdCI0gnjV0m1s78Y7++oUXzGhvr0L+2vbJF9vVziCxo5u5KVZJV83ISdS9ieMkBh849lPcaSxQ3QYmrNqTj4evHym6DDICH5w4RTkpyVKvt63dtfigTX7JV+v1hQ7bHD7pB8a4PEH4XQof3z2pgpfXCYsW0wGbL7zQsWfCBD1oz2MqB5jgLuRxglLbdMRX9zGPhLp/Ht7NZ764Ijk6z3c0A6r2Sj5erVmxZx8LJsh/Thejy8AV5yGHEgpXk1djjYFcbQpPmOPCTkRJcJE9VwOmjAXD4+uL8exlk7RYZARJJgM2BWHmfVqScREm5RlR26q9Ffkr5hfgPtWlkm+Xqk5Hba4HH/f2VeP13Yck3y9hAxEiTBRvbL8VMRp0rxucc7h9gXgojHCilccp8opiQlGTJmQJPl6taYpEMKiR9+XvHLHpgofgiHl35EpzLDhF5dK333Q7e+drEtIvFEiTFTvyvkF+O55E0WHoSnNwTAYgHSbWXQoZAROhw0mo/QT2h66fBZmF6ZJvl6tybAngHOgJShtma9fvX0Qda1dkq4zHsxGAxa40tEVlrbeeO9kXeWPkSbqR4kwUb22rjDue5Mm9UjJajbgya/Mp4oBKpBsNWPN98+VdJ2tnWHc88Y+SdepVYwxuDLtcEt4VZ5zrqqqLT94fic+PuKTdJ03LJqMOXQiRmRAiTBRPZvZiL9v8VIHNAmFezjmFNGXkFr832Yvyuukq2Xr9gWwzdsk2fq07uoFBUiUcGJhY0c3LGYjUhPVcUfG5bDBI2HljEiUY1pOMtJsVMOaxB8lwkT1TEYD8lKtqGqiiV1S+csmN57eIH0lAhIfO4+2YGdVs2TrU9PVSCX42lkuTJewFbI9wYQ/XDtXsvXFm9QTlt2+Dly5On6twwk5ESXCRBNcmXZ44lDCR6+oYoC6FGfa4PFLd0WOOnqNzgflDZIOJQlHoqoan316cQZm5qdKtj6PLwgXjQ8mMjGJDoAQKfzh2rmwJ9DuLJXeK4Iu0WGQGDkddqzdUyvZ+m66YDJCPcpu7askyVYTdkhYwu7pjZWwmo34wYVTJFtnPJXlp6JMykSY7kgQGdEVYaIJrZ1hfOqhMY1SuWBaNiZnUekstbhoejYeuXKWZOt7d38dwlFKhGPlckh7R8qrkq5y/aJRjgt/84FkJ09Ohx2Lp02QZF2EjIQSYaIJhxs68MT7FaLD0IwfXjQFqVQ6TTWsZgM+POyTrJbtna/sQXeYEuFYZdgTUJRhk6zur9unrhq6BgNDOMJR3SzN8Jwlpdk4vyRLknURMhJKhIkmFMepzace7apqwff+vl10GGQUGGP4+et70dDePe51tQbDCEc4MpNoxn6sGGN48/vnwCbR8KyLSrNVN0bfJWFjl6tXf4KGNuXXUCbaQIkw0YT89EQ0tHdTCTUJVPo6YDbSoUFtnBLdnvf0NTKgGtKj8/rOY9hc6ZdkXbcsKUGKVV13ZOYVpUlyF6G7J4KdVS3IsNOJGJEHfdsRTTAbDXj6a/NFh6EJbpqxrUpOh02SK3JFGTbct1L6lrlaV9HQgU+OjD8R3u5twk3//EyCiOR180UluHhm7rjXU9UURF6aFSY6GScyoT2NaMY8Zzq6aab7uJkMDKV50s0AJ/L41tnFOL3YMe719ES5pDVx9UKqWrpHGgNIUGESWNkozTyN1s4enCHBfkxIrNT3aSNkCI+9cwgvbq0SHYbq/eDCKVheliM6DDJKM/JSkCZBJ7IH1x7Amt3SlWLTC5dEtZzV2syEA3hBguPvfGc6HpawAgohI6FEmGiG02GDV8KmAnrEOcedr+xGV5jGWqvNvpo2fPmZLeNej8evrooFSjEzPw3Pffv0ca/HZDCgNE99V+QL022oa+0adwm1F7YexXavdF0SCRkJJcJEM6SctaxXLcEw1uyuhcVEhwa1cWba4PUHxl1CzesPwqXCK5KiJZgM2OpuQqB7fCXUfrSkBEtKsyWKSj4JJgOyUy2oGmcJtTd31aK9KyxRVISMjL7tiGZMz0nBuVMyRYeham5/AC6HnSoGqFCK1YxEsxGN4yihFolyXL2gkEqnjdFv3zuEQ/XtY/59zjluf3k3whF1znVY+4NzMXGcdxM8fccgQuRCiTDRjJxUK647b5LoMFTN6w+orn4p+dy3zylGZBxXhI0GhjsunkYnQmPkctjHNTzL1xHCuwfqVVu+8FhLJ/bVtI3597t7Imho70ZBeqKEUREyPHV+2ggZwlef2YIjjR2iw1CtVXPy8fAVM0WHQcboxsWTkZs69iRi7Z5a3PvmPgkj0pficQ7P6q/hrFabKvx4advYJ8wlGA3Y+tOLqHQakRXtbURTjAYmSVMBvfrwsA9tndK0iSXye2lbFZ78YOwlrA7Xd8CWYJQwIn1ZNTd/XBVXPL4AilU8LKB4nJUzvP4gjvjoQgaRFyXCRFNcDmlKGOnVb949hGMtnaLDIGNkMRux91jrmH/fS+Mzx6XYYYfDbhnz718xrwAPXFYmYUTyco6zlvJ/DtTjjZ01EkZEyMgoESaaMrMgTXQIqubxBairnIoVO+xw+8Z+ImizGFGSnSxhRPrSFAxhyeMbxvz7Gw83or1LvXdkijJsuGfF2LsS9k6Uo+MPkRclwkRTrpxfgO+cUyw6DFVqCYYQ5RwZdqoYoFauTBsSxlH67oFVMzG7kE4mx8phT0AkwtESDI3p9x9dX4661i6Jo5KP2WjArPzUMdch9/iCcNJkXSIzSoSJprR2hnHPGzTZZywsJiP+9NX5VDFAxZKtZrx+48Ix/W5bVxg/e22vxBHpC2MMzjGOk+Wc992RUXciePMLO/HJEf+YfvfGxZMxl07EiMwoESaaYksw4p+fHh13dyM96u6JoKwgVXQYZJz+tsmN8rrR17J1Nwaoo5cErjmtaEwTDn0dISSYDEi1jb9NtkiuMY4T7olEMWmCHWk2uiNF5EWJMNEUs9GA3FTruLsb6dFfN3nw542VosMg47S7uhW7qlpG/XvUWlkaXz3TOaZx1naLEU9+ZX4cIpKXK9M+pso9Hn8QV6/+JA4RETI8SoSJ5vQWtacSaqNFHZ20wZVph3sM+/9Rf1DVNWyV4v2DDWMantUdjmJGfkocIpLXGcUZYxpn7vUH4KTjDxEgpkSYMbacMVbOGKtgjN0xyPNfYYzt7vvvY8bYbOlDJSQ2T35lHhZPnSA6DNXx+INwZVIipHauzLGdCN64eDJ+cOGUOESkL8lWE3aM4Yr8Xz5y49mP3HGISF5l+am4fF7BqH/P7aM7EkSMERNhxpgRwBMALgZQCuBaxljpgMXcAM7nnM8CcD+Ap6UOlJBYNQVC2FzZJDoM1Vlamo1JWUmiwyDjtLQ0G49eOfprEev21aGbxtaPm3OMd6TcGhmaEolyLP71B6OepzExy47F0+gCBpFfLFeETwdQwTmv5JyHADwPYOWJC3DOP+ac98+y2Axg9KeDhEikoqFjXN219OrGxZNpoooGWEwG/PdgAzjno/q9u1/bi+6esZW9Ip/LTEqAM8OGztDo3kutNDMxGhh6otFRN+a5YFo2zi/JilNUhAwtlkQ4H8CJzcOr+x4byncAvD2eoAgZD6fDNq7uRnq0q6oF331um+gwiAQYY/jFG/vQ2NEd8++0dobRHY4gK2nsXdFIL8YYXr/pHCSOsnLE0tIcFGepPxEGxlY54qrVH6u6hjJRr1gS4cGKig56qYExthi9ifDtQzx/HWNsG2NsW2NjY+xREjIKBek21Ld2Uwm1UXD7ArCMoxEDURaXwwbPKDrM9U9UohrS0njls2psrhxdLd0fXDgFKVZ1l07rt8CZMarjb6gnil3VrXAk0R0pIr9YvvmqARSe8HMBgFOagTPGZgF4BsBKzvmgRwDO+dOc8wWc8wVZWXQLhMRHgsmAZ76xQHQYqkITVbTFlTm6K3LODDt+eVlZHCPSl8rGwKgS4e3eZnzv79vjGJG8fnjRFCybkRPz8lXNQeSlWmE20sk4kV8se91WAFMYY8WMsQQA1wB448QFGGNFAF4B8DXO+SHpwyRkdGYXpKFzjG0+9SjBZMCMPPWXbiK9vr2wGGcUZ8S8fHckMqbat2RwTocN3lF0l6ts7IDVPPomHEp1pLEDT7wf+zyN9q4enDnREceICBnaiIkw57wHwE0A1gM4AOBFzvk+xtj1jLHr+xb7OQAHgCcZYzsZYzTYkAj12Lvl+Pf2atFhqMaNiydjeVmu6DCIRKbnpsBuMcW8/K/WHsRbe2rjGJG+FGfa4R5FUwmvxmo4cw68tK1q5AX7zClMw6+umBXHiAgZWkz3ITjnaznnJZzzSZzzX/Y9tppzvrrv3//DOU/nnM/p+4/uSxOhnGNs86lXt7+8G110BV0z9tW04ut/+TTm5amZirRmF6bh7/9zRszLJ5gMKM3Vzh2ZwoxE1LR0IRyJbZzw858exTYPlbwkYtCAHKJJxZl2eEZxa1LPWoIhrN1TS5PlNKS/lm2sJdSomYq0zEYDNlX4EOjuiWn5H1w4BUtHMaZW6SwmIyakWHCsObYSam/tqUV7V2zvFSFSo28+oknTc1OoJmWMPP4gnJk2qhigIamJZljMxphKqEWiHNeeXkil0yT2h/8exuGGjhGX45zjxy/t0lyVm/U3nwdXjBNwPf5AzMsSIjVKhIkm5aRa8Z1zikWHoQpaKeRPTvadc4oRjSG3MhoYfrJsGp0ISSzWDnP+QAj/OVCPBI3dkfH4A9hT3TricqGeKOpbu1GQnihDVIScSlufPEJOcO3Tm0c1YUWvVszOG1NLXqJsNy6ejJxU64jLrd1Ti5+/vleGiPTF5bDFdPzx+LR5IvrJET/+/dnIE5YTTAZs+9lFVDqNCEN7HtEss8kAt2/kW5N6t+FQI5qDIdFhEIm9sPVoTCWsKho6RlVhgsTm8nkFuGTmyJVYvP4gXBqqGNHP5YitcobHF8ChunYZIiJkcJQIE80abXctvXr8P4dR0xLbpBaiHlazEftr2kZczuMPoFiDVyRFK3bYkZo4cqe4y+fla7J0WKxNXd472IA3d53So4sQ2VAiTDRrVkEaDDTscURemqiiSa4YSwgmW0woyaFmGlLzB0JY/tuNIy73QXkjWoJhGSKSV1GGDfevHLlbIR1/iGiUCBPNunJ+Ab65kCbMDaclGEJPhMNhTxAdCpGYK9MOW8LI3cruXVmGOYVpMkSkL5lJCQj1RNE6QpL7m3fLUdfWJVNU8kkwGTAtNxmdoeHrk7s1OkaaqAclwkSzWoIh/IImAQ3Lajbiz19fQBUDNCg10YyXrj972GXau8K485XdMkWkL4yxEYcHcM7h9QU1OzTl1hd3YYvbP+wy379gCuYW0YkYEYcSYaJZtgQT/vVplebqc0qpMxTRVEcrcrK/fORG+TATkTy+IHZWjVziiozNl88oGvaqvD8QgtHIkGobeSyxGjkdNniGmTDXE4miMCMRaTa6I0XEoUSYaFaCyYCcVCuqm2nC3FD+9xMP/vxhpegwSJzsO9aKXdUtQz7v9gdQTB3l4uYrZzgxJXvo8df2BBP+9NX5MkYkr95x6kMff71NQVzz9GYZIyLkVJQIE01zOmzwNlEiPBSvP0gTVTRspKYOVU1BODV6W14J3jtQj3ve2Dfk853hCKblaPeOzJkTHcMOe/D6A7T/EeGoeCTRtKe/tgBWM53vDcXtC+ArZxSJDoPEiSvThnf21Q/5/A2LJiEUoaFD8ZKSaB72ivyzH7lhNDD8aEmJjFHJpyw/FWX5qUM+7/YFUazBGspEXShDIJrW0N6FT44MP1lDz5aX5WDyhCTRYZA4WTYjB7+5euiugWt21444q5+M3UhjZD3+AIo1fEemJxLFeY+8j/AQJ1uTsuy4cHq2zFERcjJKhImmHWnswOqNNAZ2KNefP4kmqmiYxWTAur114JwP+vw9b+xDN00mjZusJAucDju6woOfbHj8ATg1fEXUZDQgEuU41jx4w55FUyfgvJIsmaMi5GSUCBNNG2mMpJ7trm7Bt/+2VXQYJI4YY7j3zX3wdZzaQrutK4zOcAQTki0CItMHxhheu3EhrObBK0dcXJaLiVnaviNTPEwJuSue+hi1rdTVkohFiTDRtMJ0G2pbuoa8Nadnbl8AiUN8QRPtGOpk0OvrnShHNaTj66VtVdhcOfjwrBsXT46pDbOanebKQDhy6h2JUE8Ue6pb4bDTiRgRixJhomkJJgP++q3TRIehSG5fAC4qnaV5xZl2uAcZp1rksOFXl88UEJG+uH0BbKlsOuXxz44247vPbRMQkbx+eNEULCk9dRxwdXMQOalWJJgoDSFi0R5ING96bgqC3TQhaCCLyfj/27v3IKnKM4/j32d6LswMl1GG63AZQGQXEQUphBCQTbwg5QbWRMu4JayJZaDiViwTEtxEk81WalHK3Y0m0dIE12SjMYqObLxiIDGJC4pyGUAQhAFnBrkMMsgMlxnm3T+6p+3p6Z7p2Nin6ff3qeqizzlv13nP0+9pnjnnvO/LhV306JbccMv0EUwZ2bfT+hMtpxnZL3c7amWLyvLEV+R3H2xKaQrss93OAx/xk1U7Oq0/drKVaed1bpcimaZEWHLef658l+Vv1wZdjayzcOYoZo0bFHQ15FN2/oBeFCUYQvDel7bzQvW+AGrkl8q+pexOkAjXNDRR6ckYusvfruu0bvyQMv792vEB1EakIyXCkvOSXZHx3bee2qihszywtf4oNz/auVOkT4lYkCYMK+PxW6Z0Wt+jINTlGLu5Yui5JdQdOU5rXD+NJ97Yyxu7Oz8yIpJpSoQl51X2LWF3F9N8+qixuYUXq/dpshEPVPYtZU9Dc6ch1Pbk+Bi22aIglMcfth+g+VRrh/Vf/7vzEj47m2uK8kP061lE/ZETHda/uPkDjp1sCahWIh/T/4KS8y4Y3IfPjdFYlbFqGpqoLNeIAT7oU1JAQcg6DKHW1ua4cfIw+mnotIx4YNVOdh44Fl12znHHbzdwstWPOzKv3nEZw+LGS645pDsSkh2UCEvOG9inB/80bUTQ1cgqew83U6mrgd64dcYo2mKuCOflGXdcOUZ/CGVI/Mgdh5tO8ft3DlCUn/ud5SA8sVF1bWN0ueV0Gx80nmDIORq1RoKnRFi8cN1Dr3c51alvrhk/iPuuSz71ruSWhTNHMaB3j+jyC9X7+O6z1QHWyC/D+5awJ+bxrPY7Mr5Ys6uhQ4flglAe6+++QkOnSVZQKxQv9CgIJey57as/bD9IQ1Pn2cYkNz2+di8/Xb0zuvzegWP06pHbEzlkky9dMoTZFw6MLu893ExlDk+tHC9+Upfdh5rYXNfYxSdEMkeJsHihsm+prgjHuH/VDuqPaGpTX5QUhti672h0uabBr0QsaMP7llJSmB9dnntxBfd80Z+hw0aUl1ATc0V89bYDPK+h+yRLKBEWL1w8tIz8PD0P2U4dVfxSWd7xD8E+xQWMGdgrwBr5peHYSa554M/R5VXbDnDYozsyw84t5Udzx0WX9zQ0MVy/P5IllAiLF754yRBumloZdDWyQmNzC6da2yjvWRh0VSRDKvuW0LPo4yuSd//9WCYMOyfAGvmlX68iTrScpvF4eLiw/3p1Bx8cPdHNp3JHYX4eI/v1jI5bvruhmRGa3l2yhBJh8cKHTae4q2pz0NXICkUFeTx682SNGOCRspJCnvzaVCA8te23n94YcI38YmbR52Sdc9Q0NDHCsyui33xqA2/UhCfQ+MbnRzNRf4hJllAiLF4oKQrx5Jvv0xI3u5GPmk62Mrp/z6CrIRn2yGu7eHf/R9QcamJTrToqZdpNU4ZTUpjPh80t5JlxTqlfd2Ta+2mcbnMM6F1EWYlfxy/ZS4mweKEoP0T/3kXUfqgOYv+zZi+P/GlX0NWQDNtS38im2kZNrRyQGy8dxnn9e1JSGOLn8ycFXZ2Mq+xbSk1DE3sPN3PjI2uDro5IlBJh8caI8lL2HtZUy3s8G8NUwto7zL1/+Li+/wCs3Lqf7z+3maaTrZzXz787MlNH9eWS4edQc6iJ4RqxRLKIEmHxxiPzJnHZ+ZpquaahiRFKhLzTfkVuwWUjueOK84Oujnf6FBdQXdfIY6/X8OjrNUFXJ+PGVfThmvGD9fsjWUeJsHhjX+MJ/rzjUNDVCNzsCwd5eUXKd7PGDeS+6y9ixcZ6mk62Bl0d71RGZpfzdcSE1tNtTFuyisryUq4YOyDo6ohEKREWb+w6eEzPxgK3TB/pXUcdgcJQHs9v2se//W4rp9RpNOP69SqisryUdz/4yMsxdPND4XRjVHlPpo/WnTnJHiklwmY2y8y2m9lOM1ucYLuZ2f2R7ZvMbOKZr6pIeuKn+fRRdW0j85a9EXQ1JAB5eca3n97EoWOn6N+rKOjqeMfMWL7wM1w7sYJRnt6RqSwvYcbS1dRpVkvJIt0mwmYWAn4KXA2MBb5sZmPjil0NjI68bgUePMP1FEnbhr0fUtPQzIjFzzNtySqq1tdldP9V6+uYtmRVoPuft2wtr717MJD9S7Cq1tfR2uYA+Ow9q/X9Z1jV+jou/tdXWPLiNmb/+E/exb9qfV102L7rHnzdu+OX7JXffREmAzudc7sAzOw3wBxga0yZOcAvnXMOWGNmZWY2yDmnycQlK1Str+Ou57YA4IC6I8e585lqAOZOqMjI/u98pprjLeGZlXzbvwSr/ftvp+8/s3w//+KPv77xhFfHL9ktlUS4Ang/ZrkWuDSFMhWAEmHJCktf3h79EW53vOU031m+ibkTKrirajMrNtZHt/1x0Uze2H2YRU9viq774ZwLmDVuIJN/9Pvousv/dgD3XX8RC371Fv+3qwGAglAe6753OY+v3cs9L20D4OiJFpzrWKfjLaf5XtVm5k6o4Nqf/YX3DoYf2xjUpwcv3T6DH7+6g2V/2R0tv3zhVI6dPM38mEcb/vlz53HL9JHMuHd1dPrW8UP68KuvXtrhmJLtf+nL2/UfkQeStX99/5nhe/x9P37JbqkkwonmYXWfoAxmdivhRycYNmxYCrsWOTPqkzyTdqo13Glo8dV/wzev/HhIqd49Cpg5pj9/XDQzuq64MERhKK/DuvYOIEuvG8/pto5N/tqJFcy+cCAAE364MuH+23vv//dXJtMW+Xz71Me3zhjJ/M8Mj5btWZSPgw7771EQAuB/b/ssLnLKhfKs0zEl23+yuEhuSfY96/vPDN/j7/vxS3ZLJRGuBYbGLA8B6j9BGZxzDwMPA0yaNKlToizyaRlcVpywg8bgsmIASos6nwqFeUZhfufRFRJNDdqrR0GndT0KQtFEtbv9907w+eLCEMWFoZT236ek8+djj6m7/Utu0/cfLN/j7/vxS3ZLZdSIN4HRZjbCzAqBG4AVcWVWAPMio0dMARr1fLBkk0VXjaG4oGNSWVwQYtFVY7R/yXn6/oPle/x9P37Jbt1eEXbOtZrZbcDLQAhY5pzbYmYLItsfAl4AZgM7gWbg5k+vyiJ/vfbn0Ja+vJ36I8cZXFbMoqvGZOz5NN/3L8HS9x8s3+Pv+/FLdjMX34MmQyZNmuTWrVsXyL5FRERExB9m9pZzblL8es0sJyIiIiJeUiIsIiIiIl5SIiwiIiIiXlIiLCIiIiJeUiIsIiIiIl5SIiwiIiIiXgps+DQzOwjsCWTnUA4cCmjfuUDxS4/ilx7FLz2KX3oUv/QofulR/D654c65fvErA0uEg2Rm6xKNJSepUfzSo/ilR/FLj+KXHsUvPYpfehS/M0+PRoiIiIiIl5QIi4iIiIiXfE2EHw66Amc5xS89il96FL/0KH7pUfzSo/ilR/E7w7x8RlhERERExNcrwiIiIiLiuZxNhM1slpltN7OdZrY4wXYzs/sj2zeZ2cQg6pmNzGyoma02s3fMbIuZfSNBmZlm1mhmGyKvu4OoazYzsxozq47EZ12C7WqDSZjZmJi2tcHMjprZ7XFl1AZjmNkyMztgZptj1p1rZivNbEfk33OSfLbL30sfJInfUjPbFjk/nzWzsiSf7fJc90GS+P3AzOpiztHZST6r9pc4fk/GxK7GzDYk+az37S8tzrmcewEh4D1gJFAIbATGxpWZDbwIGDAFWBt0vbPlBQwCJkbe9wLeTRC/mcDvgq5rNr+AGqC8i+1qg6nFMQR8QHgMyNj1aoMd4zEDmAhsjll3L7A48n4xcE+S+Hb5e+nDK0n8rgTyI+/vSRS/yLYuz3UfXkni9wPgW918Tu0vSfzitt8H3J1km/ftL51Xrl4RngzsdM7tcs6dAn4DzIkrMwf4pQtbA5SZ2aBMVzQbOef2Oefejrz/CHgHqAi2VjlJbTA1nwfec84FNQHPWcE59xpwOG71HOCxyPvHgLkJPprK72XOSxQ/59wrzrnWyOIaYEjGK3aWSNL+UqH2R9fxMzMDrgeeyGilPJGriXAF8H7Mci2dE7lUynjPzCqBCcDaBJunmtlGM3vRzC7IaMXODg54xczeMrNbE2xX5aLtewAAAsBJREFUG0zNDST/D0BtsGsDnHP7IPwHLtA/QRm1w9R8hfAdnES6O9d9dlvk0ZJlSR7NUfvr3nRgv3NuR5Ltan9pyNVE2BKsix8eI5UyXjOznsBy4Hbn3NG4zW8TvlV9EfAAUJXp+p0FpjnnJgJXA183sxlx29UGu2FmhcAXgKcSbFYbPDPUDrthZt8FWoFfJynS3bnuqweBUcDFwD7Ct/fjqf1178t0fTVY7S8NuZoI1wJDY5aHAPWfoIy3zKyAcBL8a+fcM/HbnXNHnXPHIu9fAArMrDzD1cxqzrn6yL8HgGcJ3wKMpTbYvauBt51z++M3qA2mZH/74zaRfw8kKKN22AUzmw9cA/yjizyQGS+Fc91Lzrn9zrnTzrk24BESx0Xtrwtmlg9cCzyZrIzaX3pyNRF+ExhtZiMiV5RuAFbElVkBzIv03J8CNLbfQvRd5HmkXwDvOOf+I0mZgZFymNlkwm2pIXO1zG5mVmpmvdrfE+50szmumNpg95JeCVEbTMkKYH7k/XzguQRlUvm99JKZzQK+A3zBOdecpEwq57qX4vo8/AOJ46L217XLgW3OudpEG9X+0pcfdAU+Dc65VjO7DXiZcI/UZc65LWa2ILL9IeAFwr32dwLNwM1B1TcLTQNuAqpjhmv5F2AYROP3JWChmbUCx4Ebkl0t8dQA4NlInpYPPO6ce0ltMHVmVgJcAXwtZl1s/NQGY5jZE4RH0ig3s1rg+8AS4Ldm9lVgL3BdpOxg4OfOudnJfi+DOIYgJYnfnUARsDJyLq9xzi2IjR9JzvUADiFQSeI308wuJvyoQw2Rc1ntr7NE8XPO/YIEfSTU/s4szSwnIiIiIl7K1UcjRERERES6pERYRERERLykRFhEREREvKREWERERES8pERYRERERLykRFhEREREvKREWERERES8pERYRERERLz0/8q/EoBb/XRvAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 864x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 定量特征二值化的核心在于设定一个阈值，大于阈值的赋值为1，小于等于阈值的赋值为0\n",
    "from sklearn.preprocessing import Binarizer\n",
    "#二值化，阈值设置为3，返回值为二值化后的数据\n",
    "x_pro=Binarizer(threshold=2).fit_transform(x_raw)\n",
    "\n",
    "print('Max :', x_pro.max(axis=0))\n",
    "print('Min :', x_pro.min(axis=0))\n",
    "print('Mean:', x_pro.mean(axis=0))\n",
    "print('Std :',x_pro.std(axis=0))\n",
    "\n",
    "fig, axs = plt.subplots(2, 1, figsize=(12, 10))\n",
    "axs[0].plot(x_raw, marker='o', linestyle='dashed', linewidth=1)\n",
    "axs[1].plot(x_pro, marker='o', linestyle='dashed', linewidth=1)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "## MinMaxScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Max : [2.]\n",
      "Min : [0.]\n",
      "Mean: [1.06666667]\n",
      "Std : [0.63867146]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#区间缩放法的思路有多种，常见的一种为利用两个最值进行缩放\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "#区间缩放，返回值为缩放到[0, 1]区间的数据\n",
    "x_pro=MinMaxScaler(feature_range=(0, 2)).fit_transform(x_raw)\n",
    "\n",
    "print('Max :', x_pro.max(axis=0))\n",
    "print('Min :', x_pro.min(axis=0))\n",
    "print('Mean:', x_pro.mean(axis=0))\n",
    "print('Std :',x_pro.std(axis=0))\n",
    "\n",
    "fig, axs = plt.subplots(2, 1, figsize=(12, 10))\n",
    "axs[0].plot(x_raw, marker='o', linestyle='dashed', linewidth=1)\n",
    "axs[1].plot(x_pro, marker='o', linestyle='dashed', linewidth=1)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "## KBinsDiscretizer  \n",
    "k个等宽箱的离散化特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "分桶边界：  [0.         4.         6.66666667 9.        ]\n",
      "Max : [2.]\n",
      "Min : [0.]\n",
      "Mean: [1.05]\n",
      "Std : [0.80467385]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x720 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.preprocessing import KBinsDiscretizer\n",
    "\n",
    "model = KBinsDiscretizer(n_bins=3,encode='ordinal')\n",
    "\n",
    "x_pro=model.fit_transform(x_raw)\n",
    "\n",
    "print('分桶边界： ',model.bin_edges_[0])\n",
    "print('Max :', x_pro.max(axis=0))\n",
    "print('Min :', x_pro.min(axis=0))\n",
    "print('Mean:', x_pro.mean(axis=0))\n",
    "print('Std :',x_pro.std(axis=0))\n",
    "\n",
    "fig, axs = plt.subplots(2, 1, figsize=(12, 10))\n",
    "axs[0].plot(x_raw, marker='o', linestyle='dashed', linewidth=1)\n",
    "axs[1].plot(x_pro, marker='o', linestyle='dashed', linewidth=1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "# Label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['G', 'B', 'G', 'R', 'R', 'G']\n"
     ]
    }
   ],
   "source": [
    "label_raw = ['G','B','G','R','R','G']\n",
    "print(label_raw)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "## LabelBinarizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Label:  ['B' 'G' 'R']\n",
      "[[0 1 0]\n",
      " [1 0 0]\n",
      " [0 1 0]\n",
      " [0 0 1]\n",
      " [0 0 1]\n",
      " [0 1 0]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import LabelBinarizer\n",
    "model = LabelBinarizer()\n",
    "label_pro = model.fit_transform(label_raw)\n",
    "\n",
    "model.get_params()\n",
    "print('Label: ', model.classes_)\n",
    "print(label_pro)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "## LabelEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Label:  ['B' 'G' 'R']\n",
      "[1 0 1 2 2 1]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import LabelEncoder\n",
    "model = LabelEncoder()\n",
    "label_pro = model.fit_transform(label_raw)\n",
    "\n",
    "model.get_params()\n",
    "print('Label: ', model.classes_)\n",
    "print(label_pro)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "## MultiLabelBinarizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Label:  ['B' 'G' 'R']\n",
      "[[0 1 0]\n",
      " [1 0 0]\n",
      " [0 1 0]\n",
      " [0 0 1]\n",
      " [0 0 1]\n",
      " [0 1 0]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import MultiLabelBinarizer\n",
    "model = MultiLabelBinarizer()\n",
    "label_pro = model.fit_transform(label_raw)\n",
    "\n",
    "model.get_params()\n",
    "print('Label: ', model.classes_)\n",
    "print(label_pro)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on package sklearn.preprocessing in sklearn:\n",
      "\n",
      "NAME\n",
      "    sklearn.preprocessing\n",
      "\n",
      "DESCRIPTION\n",
      "    The :mod:`sklearn.preprocessing` module includes scaling, centering,\n",
      "    normalization, binarization methods.\n",
      "\n",
      "PACKAGE CONTENTS\n",
      "    _csr_polynomial_expansion\n",
      "    _data\n",
      "    _discretization\n",
      "    _encoders\n",
      "    _function_transformer\n",
      "    _label\n",
      "    data\n",
      "    label\n",
      "    setup\n",
      "    tests (package)\n",
      "\n",
      "CLASSES\n",
      "    sklearn.base.BaseEstimator(builtins.object)\n",
      "        sklearn.preprocessing._data.Binarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.KernelCenterer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.MaxAbsScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.MinMaxScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.Normalizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.PolynomialFeatures(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.PowerTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.QuantileTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.RobustScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.StandardScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._discretization.KBinsDiscretizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._function_transformer.FunctionTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._label.LabelBinarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._label.LabelEncoder(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._label.MultiLabelBinarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "    sklearn.base.TransformerMixin(builtins.object)\n",
      "        sklearn.preprocessing._data.Binarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.KernelCenterer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.MaxAbsScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.MinMaxScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.Normalizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.PolynomialFeatures(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.PowerTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.QuantileTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.RobustScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._data.StandardScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._discretization.KBinsDiscretizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._function_transformer.FunctionTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._label.LabelBinarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._label.LabelEncoder(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._label.MultiLabelBinarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "    sklearn.preprocessing._encoders._BaseEncoder(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "        sklearn.preprocessing._encoders.OneHotEncoder\n",
      "        sklearn.preprocessing._encoders.OrdinalEncoder\n",
      "    \n",
      "    class Binarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Binarize data (set feature values to 0 or 1) according to a threshold\n",
      "     |  \n",
      "     |  Values greater than the threshold map to 1, while values less than\n",
      "     |  or equal to the threshold map to 0. With the default threshold of 0,\n",
      "     |  only positive values map to 1.\n",
      "     |  \n",
      "     |  Binarization is a common operation on text count data where the\n",
      "     |  analyst can decide to only consider the presence or absence of a\n",
      "     |  feature rather than a quantified number of occurrences for instance.\n",
      "     |  \n",
      "     |  It can also be used as a pre-processing step for estimators that\n",
      "     |  consider boolean random variables (e.g. modelled using the Bernoulli\n",
      "     |  distribution in a Bayesian setting).\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_binarization>`.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  threshold : float, optional (0.0 by default)\n",
      "     |      Feature values below or equal to this are replaced by 0, above it by 1.\n",
      "     |      Threshold may not be less than 0 for operations on sparse matrices.\n",
      "     |  \n",
      "     |  copy : boolean, optional, default True\n",
      "     |      set to False to perform inplace binarization and avoid a copy (if\n",
      "     |      the input is already a numpy array or a scipy.sparse CSR matrix).\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn.preprocessing import Binarizer\n",
      "     |  >>> X = [[ 1., -1.,  2.],\n",
      "     |  ...      [ 2.,  0.,  0.],\n",
      "     |  ...      [ 0.,  1., -1.]]\n",
      "     |  >>> transformer = Binarizer().fit(X)  # fit does nothing.\n",
      "     |  >>> transformer\n",
      "     |  Binarizer()\n",
      "     |  >>> transformer.transform(X)\n",
      "     |  array([[1., 0., 1.],\n",
      "     |         [1., 0., 0.],\n",
      "     |         [0., 1., 0.]])\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  If the input is a sparse matrix, only the non-zero values are subject\n",
      "     |  to update by the Binarizer class.\n",
      "     |  \n",
      "     |  This estimator is stateless (besides constructor parameters), the\n",
      "     |  fit method does nothing but is useful when used in a pipeline.\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  binarize: Equivalent function without the estimator API.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      Binarizer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, threshold=0.0, copy=True)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Do nothing and return the estimator unchanged\n",
      "     |      \n",
      "     |      This method is just there to implement the usual API and hence\n",
      "     |      work in pipelines.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like\n",
      "     |  \n",
      "     |  transform(self, X, copy=None)\n",
      "     |      Binarize each element of X\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "     |          The data to binarize, element by element.\n",
      "     |          scipy.sparse matrices should be in CSR format to avoid an\n",
      "     |          un-necessary copy.\n",
      "     |      \n",
      "     |      copy : bool\n",
      "     |          Copy the input X or not.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class FunctionTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Constructs a transformer from an arbitrary callable.\n",
      "     |  \n",
      "     |  A FunctionTransformer forwards its X (and optionally y) arguments to a\n",
      "     |  user-defined function or function object and returns the result of this\n",
      "     |  function. This is useful for stateless transformations such as taking the\n",
      "     |  log of frequencies, doing custom scaling, etc.\n",
      "     |  \n",
      "     |  Note: If a lambda is used as the function, then the resulting\n",
      "     |  transformer will not be pickleable.\n",
      "     |  \n",
      "     |  .. versionadded:: 0.17\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <function_transformer>`.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  func : callable, optional default=None\n",
      "     |      The callable to use for the transformation. This will be passed\n",
      "     |      the same arguments as transform, with args and kwargs forwarded.\n",
      "     |      If func is None, then func will be the identity function.\n",
      "     |  \n",
      "     |  inverse_func : callable, optional default=None\n",
      "     |      The callable to use for the inverse transformation. This will be\n",
      "     |      passed the same arguments as inverse transform, with args and\n",
      "     |      kwargs forwarded. If inverse_func is None, then inverse_func\n",
      "     |      will be the identity function.\n",
      "     |  \n",
      "     |  validate : bool, optional default=False\n",
      "     |      Indicate that the input X array should be checked before calling\n",
      "     |      ``func``. The possibilities are:\n",
      "     |  \n",
      "     |      - If False, there is no input validation.\n",
      "     |      - If True, then X will be converted to a 2-dimensional NumPy array or\n",
      "     |        sparse matrix. If the conversion is not possible an exception is\n",
      "     |        raised.\n",
      "     |  \n",
      "     |      .. versionchanged:: 0.22\n",
      "     |         The default of ``validate`` changed from True to False.\n",
      "     |  \n",
      "     |  accept_sparse : boolean, optional\n",
      "     |      Indicate that func accepts a sparse matrix as input. If validate is\n",
      "     |      False, this has no effect. Otherwise, if accept_sparse is false,\n",
      "     |      sparse matrix inputs will cause an exception to be raised.\n",
      "     |  \n",
      "     |  check_inverse : bool, default=True\n",
      "     |     Whether to check that or ``func`` followed by ``inverse_func`` leads to\n",
      "     |     the original inputs. It can be used for a sanity check, raising a\n",
      "     |     warning when the condition is not fulfilled.\n",
      "     |  \n",
      "     |     .. versionadded:: 0.20\n",
      "     |  \n",
      "     |  kw_args : dict, optional\n",
      "     |      Dictionary of additional keyword arguments to pass to func.\n",
      "     |  \n",
      "     |      .. versionadded:: 0.18\n",
      "     |  \n",
      "     |  inv_kw_args : dict, optional\n",
      "     |      Dictionary of additional keyword arguments to pass to inverse_func.\n",
      "     |  \n",
      "     |      .. versionadded:: 0.18\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> import numpy as np\n",
      "     |  >>> from sklearn.preprocessing import FunctionTransformer\n",
      "     |  >>> transformer = FunctionTransformer(np.log1p)\n",
      "     |  >>> X = np.array([[0, 1], [2, 3]])\n",
      "     |  >>> transformer.transform(X)\n",
      "     |  array([[0.       , 0.6931...],\n",
      "     |         [1.0986..., 1.3862...]])\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      FunctionTransformer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, func=None, inverse_func=None, *, validate=False, accept_sparse=False, check_inverse=True, kw_args=None, inv_kw_args=None)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Fit transformer by checking X.\n",
      "     |      \n",
      "     |      If ``validate`` is ``True``, ``X`` will be checked.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape (n_samples, n_features)\n",
      "     |          Input array.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self\n",
      "     |  \n",
      "     |  inverse_transform(self, X)\n",
      "     |      Transform X using the inverse function.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape (n_samples, n_features)\n",
      "     |          Input array.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_out : array-like, shape (n_samples, n_features)\n",
      "     |          Transformed input.\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Transform X using the forward function.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape (n_samples, n_features)\n",
      "     |          Input array.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_out : array-like, shape (n_samples, n_features)\n",
      "     |          Transformed input.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class KBinsDiscretizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Bin continuous data into intervals.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_discretization>`.\n",
      "     |  \n",
      "     |  .. versionadded:: 0.20\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  n_bins : int or array-like, shape (n_features,) (default=5)\n",
      "     |      The number of bins to produce. Raises ValueError if ``n_bins < 2``.\n",
      "     |  \n",
      "     |  encode : {'onehot', 'onehot-dense', 'ordinal'}, (default='onehot')\n",
      "     |      Method used to encode the transformed result.\n",
      "     |  \n",
      "     |      onehot\n",
      "     |          Encode the transformed result with one-hot encoding\n",
      "     |          and return a sparse matrix. Ignored features are always\n",
      "     |          stacked to the right.\n",
      "     |      onehot-dense\n",
      "     |          Encode the transformed result with one-hot encoding\n",
      "     |          and return a dense array. Ignored features are always\n",
      "     |          stacked to the right.\n",
      "     |      ordinal\n",
      "     |          Return the bin identifier encoded as an integer value.\n",
      "     |  \n",
      "     |  strategy : {'uniform', 'quantile', 'kmeans'}, (default='quantile')\n",
      "     |      Strategy used to define the widths of the bins.\n",
      "     |  \n",
      "     |      uniform\n",
      "     |          All bins in each feature have identical widths.\n",
      "     |      quantile\n",
      "     |          All bins in each feature have the same number of points.\n",
      "     |      kmeans\n",
      "     |          Values in each bin have the same nearest center of a 1D k-means\n",
      "     |          cluster.\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  n_bins_ : int array, shape (n_features,)\n",
      "     |      Number of bins per feature. Bins whose width are too small\n",
      "     |      (i.e., <= 1e-8) are removed with a warning.\n",
      "     |  \n",
      "     |  bin_edges_ : array of arrays, shape (n_features, )\n",
      "     |      The edges of each bin. Contain arrays of varying shapes ``(n_bins_, )``\n",
      "     |      Ignored features will have empty arrays.\n",
      "     |  \n",
      "     |  See Also\n",
      "     |  --------\n",
      "     |   sklearn.preprocessing.Binarizer : Class used to bin values as ``0`` or\n",
      "     |      ``1`` based on a parameter ``threshold``.\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  In bin edges for feature ``i``, the first and last values are used only for\n",
      "     |  ``inverse_transform``. During transform, bin edges are extended to::\n",
      "     |  \n",
      "     |    np.concatenate([-np.inf, bin_edges_[i][1:-1], np.inf])\n",
      "     |  \n",
      "     |  You can combine ``KBinsDiscretizer`` with\n",
      "     |  :class:`sklearn.compose.ColumnTransformer` if you only want to preprocess\n",
      "     |  part of the features.\n",
      "     |  \n",
      "     |  ``KBinsDiscretizer`` might produce constant features (e.g., when\n",
      "     |  ``encode = 'onehot'`` and certain bins do not contain any data).\n",
      "     |  These features can be removed with feature selection algorithms\n",
      "     |  (e.g., :class:`sklearn.feature_selection.VarianceThreshold`).\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> X = [[-2, 1, -4,   -1],\n",
      "     |  ...      [-1, 2, -3, -0.5],\n",
      "     |  ...      [ 0, 3, -2,  0.5],\n",
      "     |  ...      [ 1, 4, -1,    2]]\n",
      "     |  >>> est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')\n",
      "     |  >>> est.fit(X)\n",
      "     |  KBinsDiscretizer(...)\n",
      "     |  >>> Xt = est.transform(X)\n",
      "     |  >>> Xt  # doctest: +SKIP\n",
      "     |  array([[ 0., 0., 0., 0.],\n",
      "     |         [ 1., 1., 1., 0.],\n",
      "     |         [ 2., 2., 2., 1.],\n",
      "     |         [ 2., 2., 2., 2.]])\n",
      "     |  \n",
      "     |  Sometimes it may be useful to convert the data back into the original\n",
      "     |  feature space. The ``inverse_transform`` function converts the binned\n",
      "     |  data into the original feature space. Each value will be equal to the mean\n",
      "     |  of the two bin edges.\n",
      "     |  \n",
      "     |  >>> est.bin_edges_[0]\n",
      "     |  array([-2., -1.,  0.,  1.])\n",
      "     |  >>> est.inverse_transform(Xt)\n",
      "     |  array([[-1.5,  1.5, -3.5, -0.5],\n",
      "     |         [-0.5,  2.5, -2.5, -0.5],\n",
      "     |         [ 0.5,  3.5, -1.5,  0.5],\n",
      "     |         [ 0.5,  3.5, -1.5,  1.5]])\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      KBinsDiscretizer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, n_bins=5, *, encode='onehot', strategy='quantile')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Fit the estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : numeric array-like, shape (n_samples, n_features)\n",
      "     |          Data to be discretized.\n",
      "     |      \n",
      "     |      y : None\n",
      "     |          Ignored. This parameter exists only for compatibility with\n",
      "     |          :class:`sklearn.pipeline.Pipeline`.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self\n",
      "     |  \n",
      "     |  inverse_transform(self, Xt)\n",
      "     |      Transform discretized data back to original feature space.\n",
      "     |      \n",
      "     |      Note that this function does not regenerate the original data\n",
      "     |      due to discretization rounding.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      Xt : numeric array-like, shape (n_sample, n_features)\n",
      "     |          Transformed data in the binned space.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      Xinv : numeric array-like\n",
      "     |          Data in the original feature space.\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Discretize the data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : numeric array-like, shape (n_samples, n_features)\n",
      "     |          Data to be discretized.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      Xt : numeric array-like or sparse matrix\n",
      "     |          Data in the binned space.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class KernelCenterer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Center a kernel matrix\n",
      "     |  \n",
      "     |  Let K(x, z) be a kernel defined by phi(x)^T phi(z), where phi is a\n",
      "     |  function mapping x to a Hilbert space. KernelCenterer centers (i.e.,\n",
      "     |  normalize to have zero mean) the data without explicitly computing phi(x).\n",
      "     |  It is equivalent to centering phi(x) with\n",
      "     |  sklearn.preprocessing.StandardScaler(with_std=False).\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <kernel_centering>`.\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  K_fit_rows_ : array, shape (n_samples,)\n",
      "     |      Average of each column of kernel matrix\n",
      "     |  \n",
      "     |  K_fit_all_ : float\n",
      "     |      Average of kernel matrix\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn.preprocessing import KernelCenterer\n",
      "     |  >>> from sklearn.metrics.pairwise import pairwise_kernels\n",
      "     |  >>> X = [[ 1., -2.,  2.],\n",
      "     |  ...      [ -2.,  1.,  3.],\n",
      "     |  ...      [ 4.,  1., -2.]]\n",
      "     |  >>> K = pairwise_kernels(X, metric='linear')\n",
      "     |  >>> K\n",
      "     |  array([[  9.,   2.,  -2.],\n",
      "     |         [  2.,  14., -13.],\n",
      "     |         [ -2., -13.,  21.]])\n",
      "     |  >>> transformer = KernelCenterer().fit(K)\n",
      "     |  >>> transformer\n",
      "     |  KernelCenterer()\n",
      "     |  >>> transformer.transform(K)\n",
      "     |  array([[  5.,   0.,  -5.],\n",
      "     |         [  0.,  14., -14.],\n",
      "     |         [ -5., -14.,  19.]])\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      KernelCenterer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, K, y=None)\n",
      "     |      Fit KernelCenterer\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      K : numpy array of shape [n_samples, n_samples]\n",
      "     |          Kernel matrix.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : returns an instance of self.\n",
      "     |  \n",
      "     |  transform(self, K, copy=True)\n",
      "     |      Center kernel matrix.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      K : numpy array of shape [n_samples1, n_samples2]\n",
      "     |          Kernel matrix.\n",
      "     |      \n",
      "     |      copy : boolean, optional, default True\n",
      "     |          Set to False to perform inplace computation.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      K_new : numpy array of shape [n_samples1, n_samples2]\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class LabelBinarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Binarize labels in a one-vs-all fashion\n",
      "     |  \n",
      "     |  Several regression and binary classification algorithms are\n",
      "     |  available in scikit-learn. A simple way to extend these algorithms\n",
      "     |  to the multi-class classification case is to use the so-called\n",
      "     |  one-vs-all scheme.\n",
      "     |  \n",
      "     |  At learning time, this simply consists in learning one regressor\n",
      "     |  or binary classifier per class. In doing so, one needs to convert\n",
      "     |  multi-class labels to binary labels (belong or does not belong\n",
      "     |  to the class). LabelBinarizer makes this process easy with the\n",
      "     |  transform method.\n",
      "     |  \n",
      "     |  At prediction time, one assigns the class for which the corresponding\n",
      "     |  model gave the greatest confidence. LabelBinarizer makes this easy\n",
      "     |  with the inverse_transform method.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_targets>`.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  neg_label : int (default: 0)\n",
      "     |      Value with which negative labels must be encoded.\n",
      "     |  \n",
      "     |  pos_label : int (default: 1)\n",
      "     |      Value with which positive labels must be encoded.\n",
      "     |  \n",
      "     |  sparse_output : boolean (default: False)\n",
      "     |      True if the returned array from transform is desired to be in sparse\n",
      "     |      CSR format.\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  classes_ : array of shape [n_class]\n",
      "     |      Holds the label for each class.\n",
      "     |  \n",
      "     |  y_type_ : str,\n",
      "     |      Represents the type of the target data as evaluated by\n",
      "     |      utils.multiclass.type_of_target. Possible type are 'continuous',\n",
      "     |      'continuous-multioutput', 'binary', 'multiclass',\n",
      "     |      'multiclass-multioutput', 'multilabel-indicator', and 'unknown'.\n",
      "     |  \n",
      "     |  sparse_input_ : boolean,\n",
      "     |      True if the input data to transform is given as a sparse matrix, False\n",
      "     |      otherwise.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn import preprocessing\n",
      "     |  >>> lb = preprocessing.LabelBinarizer()\n",
      "     |  >>> lb.fit([1, 2, 6, 4, 2])\n",
      "     |  LabelBinarizer()\n",
      "     |  >>> lb.classes_\n",
      "     |  array([1, 2, 4, 6])\n",
      "     |  >>> lb.transform([1, 6])\n",
      "     |  array([[1, 0, 0, 0],\n",
      "     |         [0, 0, 0, 1]])\n",
      "     |  \n",
      "     |  Binary targets transform to a column vector\n",
      "     |  \n",
      "     |  >>> lb = preprocessing.LabelBinarizer()\n",
      "     |  >>> lb.fit_transform(['yes', 'no', 'no', 'yes'])\n",
      "     |  array([[1],\n",
      "     |         [0],\n",
      "     |         [0],\n",
      "     |         [1]])\n",
      "     |  \n",
      "     |  Passing a 2D matrix for multilabel classification\n",
      "     |  \n",
      "     |  >>> import numpy as np\n",
      "     |  >>> lb.fit(np.array([[0, 1, 1], [1, 0, 0]]))\n",
      "     |  LabelBinarizer()\n",
      "     |  >>> lb.classes_\n",
      "     |  array([0, 1, 2])\n",
      "     |  >>> lb.transform([0, 1, 2, 1])\n",
      "     |  array([[1, 0, 0],\n",
      "     |         [0, 1, 0],\n",
      "     |         [0, 0, 1],\n",
      "     |         [0, 1, 0]])\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  label_binarize : function to perform the transform operation of\n",
      "     |      LabelBinarizer with fixed classes.\n",
      "     |  sklearn.preprocessing.OneHotEncoder : encode categorical features\n",
      "     |      using a one-hot aka one-of-K scheme.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      LabelBinarizer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, neg_label=0, pos_label=1, sparse_output=False)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, y)\n",
      "     |      Fit label binarizer\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : array of shape [n_samples,] or [n_samples, n_classes]\n",
      "     |          Target values. The 2-d matrix should only contain 0 and 1,\n",
      "     |          represents multilabel classification.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : returns an instance of self.\n",
      "     |  \n",
      "     |  fit_transform(self, y)\n",
      "     |      Fit label binarizer and transform multi-class labels to binary\n",
      "     |      labels.\n",
      "     |      \n",
      "     |      The output of transform is sometimes referred to as\n",
      "     |      the 1-of-K coding scheme.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : array or sparse matrix of shape [n_samples,] or             [n_samples, n_classes]\n",
      "     |          Target values. The 2-d matrix should only contain 0 and 1,\n",
      "     |          represents multilabel classification. Sparse matrix can be\n",
      "     |          CSR, CSC, COO, DOK, or LIL.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      Y : array or CSR matrix of shape [n_samples, n_classes]\n",
      "     |          Shape will be [n_samples, 1] for binary problems.\n",
      "     |  \n",
      "     |  inverse_transform(self, Y, threshold=None)\n",
      "     |      Transform binary labels back to multi-class labels\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      Y : numpy array or sparse matrix with shape [n_samples, n_classes]\n",
      "     |          Target values. All sparse matrices are converted to CSR before\n",
      "     |          inverse transformation.\n",
      "     |      \n",
      "     |      threshold : float or None\n",
      "     |          Threshold used in the binary and multi-label cases.\n",
      "     |      \n",
      "     |          Use 0 when ``Y`` contains the output of decision_function\n",
      "     |          (classifier).\n",
      "     |          Use 0.5 when ``Y`` contains the output of predict_proba.\n",
      "     |      \n",
      "     |          If None, the threshold is assumed to be half way between\n",
      "     |          neg_label and pos_label.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      y : numpy array or CSR matrix of shape [n_samples] Target values.\n",
      "     |      \n",
      "     |      Notes\n",
      "     |      -----\n",
      "     |      In the case when the binary labels are fractional\n",
      "     |      (probabilistic), inverse_transform chooses the class with the\n",
      "     |      greatest value. Typically, this allows to use the output of a\n",
      "     |      linear model's decision_function method directly as the input\n",
      "     |      of inverse_transform.\n",
      "     |  \n",
      "     |  transform(self, y)\n",
      "     |      Transform multi-class labels to binary labels\n",
      "     |      \n",
      "     |      The output of transform is sometimes referred to by some authors as\n",
      "     |      the 1-of-K coding scheme.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : array or sparse matrix of shape [n_samples,] or             [n_samples, n_classes]\n",
      "     |          Target values. The 2-d matrix should only contain 0 and 1,\n",
      "     |          represents multilabel classification. Sparse matrix can be\n",
      "     |          CSR, CSC, COO, DOK, or LIL.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      Y : numpy array or CSR matrix of shape [n_samples, n_classes]\n",
      "     |          Shape will be [n_samples, 1] for binary problems.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class LabelEncoder(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Encode target labels with value between 0 and n_classes-1.\n",
      "     |  \n",
      "     |  This transformer should be used to encode target values, *i.e.* `y`, and\n",
      "     |  not the input `X`.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_targets>`.\n",
      "     |  \n",
      "     |  .. versionadded:: 0.12\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  classes_ : array of shape (n_class,)\n",
      "     |      Holds the label for each class.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  `LabelEncoder` can be used to normalize labels.\n",
      "     |  \n",
      "     |  >>> from sklearn import preprocessing\n",
      "     |  >>> le = preprocessing.LabelEncoder()\n",
      "     |  >>> le.fit([1, 2, 2, 6])\n",
      "     |  LabelEncoder()\n",
      "     |  >>> le.classes_\n",
      "     |  array([1, 2, 6])\n",
      "     |  >>> le.transform([1, 1, 2, 6])\n",
      "     |  array([0, 0, 1, 2]...)\n",
      "     |  >>> le.inverse_transform([0, 0, 1, 2])\n",
      "     |  array([1, 1, 2, 6])\n",
      "     |  \n",
      "     |  It can also be used to transform non-numerical labels (as long as they are\n",
      "     |  hashable and comparable) to numerical labels.\n",
      "     |  \n",
      "     |  >>> le = preprocessing.LabelEncoder()\n",
      "     |  >>> le.fit([\"paris\", \"paris\", \"tokyo\", \"amsterdam\"])\n",
      "     |  LabelEncoder()\n",
      "     |  >>> list(le.classes_)\n",
      "     |  ['amsterdam', 'paris', 'tokyo']\n",
      "     |  >>> le.transform([\"tokyo\", \"tokyo\", \"paris\"])\n",
      "     |  array([2, 2, 1]...)\n",
      "     |  >>> list(le.inverse_transform([2, 2, 1]))\n",
      "     |  ['tokyo', 'tokyo', 'paris']\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  sklearn.preprocessing.OrdinalEncoder : Encode categorical features\n",
      "     |      using an ordinal encoding scheme.\n",
      "     |  \n",
      "     |  sklearn.preprocessing.OneHotEncoder : Encode categorical features\n",
      "     |      as a one-hot numeric array.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      LabelEncoder\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  fit(self, y)\n",
      "     |      Fit label encoder\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : array-like of shape (n_samples,)\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : returns an instance of self.\n",
      "     |  \n",
      "     |  fit_transform(self, y)\n",
      "     |      Fit label encoder and return encoded labels\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : array-like of shape [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      y : array-like of shape [n_samples]\n",
      "     |  \n",
      "     |  inverse_transform(self, y)\n",
      "     |      Transform labels back to original encoding.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : numpy array of shape [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      y : numpy array of shape [n_samples]\n",
      "     |  \n",
      "     |  transform(self, y)\n",
      "     |      Transform labels to normalized encoding.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : array-like of shape [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      y : array-like of shape [n_samples]\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class MaxAbsScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Scale each feature by its maximum absolute value.\n",
      "     |  \n",
      "     |  This estimator scales and translates each feature individually such\n",
      "     |  that the maximal absolute value of each feature in the\n",
      "     |  training set will be 1.0. It does not shift/center the data, and\n",
      "     |  thus does not destroy any sparsity.\n",
      "     |  \n",
      "     |  This scaler can also be applied to sparse CSR or CSC matrices.\n",
      "     |  \n",
      "     |  .. versionadded:: 0.17\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  copy : boolean, optional, default is True\n",
      "     |      Set to False to perform inplace scaling and avoid a copy (if the input\n",
      "     |      is already a numpy array).\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  scale_ : ndarray, shape (n_features,)\n",
      "     |      Per feature relative scaling of the data.\n",
      "     |  \n",
      "     |      .. versionadded:: 0.17\n",
      "     |         *scale_* attribute.\n",
      "     |  \n",
      "     |  max_abs_ : ndarray, shape (n_features,)\n",
      "     |      Per feature maximum absolute value.\n",
      "     |  \n",
      "     |  n_samples_seen_ : int\n",
      "     |      The number of samples processed by the estimator. Will be reset on\n",
      "     |      new calls to fit, but increments across ``partial_fit`` calls.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn.preprocessing import MaxAbsScaler\n",
      "     |  >>> X = [[ 1., -1.,  2.],\n",
      "     |  ...      [ 2.,  0.,  0.],\n",
      "     |  ...      [ 0.,  1., -1.]]\n",
      "     |  >>> transformer = MaxAbsScaler().fit(X)\n",
      "     |  >>> transformer\n",
      "     |  MaxAbsScaler()\n",
      "     |  >>> transformer.transform(X)\n",
      "     |  array([[ 0.5, -1. ,  1. ],\n",
      "     |         [ 1. ,  0. ,  0. ],\n",
      "     |         [ 0. ,  1. , -0.5]])\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  maxabs_scale: Equivalent function without the estimator API.\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  NaNs are treated as missing values: disregarded in fit, and maintained in\n",
      "     |  transform.\n",
      "     |  \n",
      "     |  For a comparison of the different scalers, transformers, and normalizers,\n",
      "     |  see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "     |  <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      MaxAbsScaler\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, copy=True)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Compute the maximum absolute value to be used for later scaling.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "     |          The data used to compute the per-feature minimum and maximum\n",
      "     |          used for later scaling along the features axis.\n",
      "     |  \n",
      "     |  inverse_transform(self, X)\n",
      "     |      Scale back the data to the original representation\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}\n",
      "     |          The data that should be transformed back.\n",
      "     |  \n",
      "     |  partial_fit(self, X, y=None)\n",
      "     |      Online computation of max absolute value of X for later scaling.\n",
      "     |      \n",
      "     |      All of X is processed as a single batch. This is intended for cases\n",
      "     |      when :meth:`fit` is not feasible due to very large number of\n",
      "     |      `n_samples` or because X is read from a continuous stream.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "     |          The data used to compute the mean and standard deviation\n",
      "     |          used for later scaling along the features axis.\n",
      "     |      \n",
      "     |      y : None\n",
      "     |          Ignored.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Transformer instance.\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Scale the data\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}\n",
      "     |          The data that should be scaled.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class MinMaxScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Transform features by scaling each feature to a given range.\n",
      "     |  \n",
      "     |  This estimator scales and translates each feature individually such\n",
      "     |  that it is in the given range on the training set, e.g. between\n",
      "     |  zero and one.\n",
      "     |  \n",
      "     |  The transformation is given by::\n",
      "     |  \n",
      "     |      X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))\n",
      "     |      X_scaled = X_std * (max - min) + min\n",
      "     |  \n",
      "     |  where min, max = feature_range.\n",
      "     |  \n",
      "     |  This transformation is often used as an alternative to zero mean,\n",
      "     |  unit variance scaling.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_scaler>`.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  feature_range : tuple (min, max), default=(0, 1)\n",
      "     |      Desired range of transformed data.\n",
      "     |  \n",
      "     |  copy : bool, default=True\n",
      "     |      Set to False to perform inplace row normalization and avoid a\n",
      "     |      copy (if the input is already a numpy array).\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  min_ : ndarray of shape (n_features,)\n",
      "     |      Per feature adjustment for minimum. Equivalent to\n",
      "     |      ``min - X.min(axis=0) * self.scale_``\n",
      "     |  \n",
      "     |  scale_ : ndarray of shape (n_features,)\n",
      "     |      Per feature relative scaling of the data. Equivalent to\n",
      "     |      ``(max - min) / (X.max(axis=0) - X.min(axis=0))``\n",
      "     |  \n",
      "     |      .. versionadded:: 0.17\n",
      "     |         *scale_* attribute.\n",
      "     |  \n",
      "     |  data_min_ : ndarray of shape (n_features,)\n",
      "     |      Per feature minimum seen in the data\n",
      "     |  \n",
      "     |      .. versionadded:: 0.17\n",
      "     |         *data_min_*\n",
      "     |  \n",
      "     |  data_max_ : ndarray of shape (n_features,)\n",
      "     |      Per feature maximum seen in the data\n",
      "     |  \n",
      "     |      .. versionadded:: 0.17\n",
      "     |         *data_max_*\n",
      "     |  \n",
      "     |  data_range_ : ndarray of shape (n_features,)\n",
      "     |      Per feature range ``(data_max_ - data_min_)`` seen in the data\n",
      "     |  \n",
      "     |      .. versionadded:: 0.17\n",
      "     |         *data_range_*\n",
      "     |  \n",
      "     |  n_samples_seen_ : int\n",
      "     |      The number of samples processed by the estimator.\n",
      "     |      It will be reset on new calls to fit, but increments across\n",
      "     |      ``partial_fit`` calls.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn.preprocessing import MinMaxScaler\n",
      "     |  >>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]\n",
      "     |  >>> scaler = MinMaxScaler()\n",
      "     |  >>> print(scaler.fit(data))\n",
      "     |  MinMaxScaler()\n",
      "     |  >>> print(scaler.data_max_)\n",
      "     |  [ 1. 18.]\n",
      "     |  >>> print(scaler.transform(data))\n",
      "     |  [[0.   0.  ]\n",
      "     |   [0.25 0.25]\n",
      "     |   [0.5  0.5 ]\n",
      "     |   [1.   1.  ]]\n",
      "     |  >>> print(scaler.transform([[2, 2]]))\n",
      "     |  [[1.5 0. ]]\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  minmax_scale: Equivalent function without the estimator API.\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  NaNs are treated as missing values: disregarded in fit, and maintained in\n",
      "     |  transform.\n",
      "     |  \n",
      "     |  For a comparison of the different scalers, transformers, and normalizers,\n",
      "     |  see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "     |  <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      MinMaxScaler\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, feature_range=(0, 1), *, copy=True)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Compute the minimum and maximum to be used for later scaling.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like of shape (n_samples, n_features)\n",
      "     |          The data used to compute the per-feature minimum and maximum\n",
      "     |          used for later scaling along the features axis.\n",
      "     |      \n",
      "     |      y : None\n",
      "     |          Ignored.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Fitted scaler.\n",
      "     |  \n",
      "     |  inverse_transform(self, X)\n",
      "     |      Undo the scaling of X according to feature_range.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like of shape (n_samples, n_features)\n",
      "     |          Input data that will be transformed. It cannot be sparse.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      Xt : array-like of shape (n_samples, n_features)\n",
      "     |          Transformed data.\n",
      "     |  \n",
      "     |  partial_fit(self, X, y=None)\n",
      "     |      Online computation of min and max on X for later scaling.\n",
      "     |      \n",
      "     |      All of X is processed as a single batch. This is intended for cases\n",
      "     |      when :meth:`fit` is not feasible due to very large number of\n",
      "     |      `n_samples` or because X is read from a continuous stream.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like of shape (n_samples, n_features)\n",
      "     |          The data used to compute the mean and standard deviation\n",
      "     |          used for later scaling along the features axis.\n",
      "     |      \n",
      "     |      y : None\n",
      "     |          Ignored.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Transformer instance.\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Scale features of X according to feature_range.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like of shape (n_samples, n_features)\n",
      "     |          Input data that will be transformed.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      Xt : array-like of shape (n_samples, n_features)\n",
      "     |          Transformed data.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class MultiLabelBinarizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Transform between iterable of iterables and a multilabel format\n",
      "     |  \n",
      "     |  Although a list of sets or tuples is a very intuitive format for multilabel\n",
      "     |  data, it is unwieldy to process. This transformer converts between this\n",
      "     |  intuitive format and the supported multilabel format: a (samples x classes)\n",
      "     |  binary matrix indicating the presence of a class label.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  classes : array-like of shape [n_classes] (optional)\n",
      "     |      Indicates an ordering for the class labels.\n",
      "     |      All entries should be unique (cannot contain duplicate classes).\n",
      "     |  \n",
      "     |  sparse_output : boolean (default: False),\n",
      "     |      Set to true if output binary array is desired in CSR sparse format\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  classes_ : array of labels\n",
      "     |      A copy of the `classes` parameter where provided,\n",
      "     |      or otherwise, the sorted set of classes found when fitting.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn.preprocessing import MultiLabelBinarizer\n",
      "     |  >>> mlb = MultiLabelBinarizer()\n",
      "     |  >>> mlb.fit_transform([(1, 2), (3,)])\n",
      "     |  array([[1, 1, 0],\n",
      "     |         [0, 0, 1]])\n",
      "     |  >>> mlb.classes_\n",
      "     |  array([1, 2, 3])\n",
      "     |  \n",
      "     |  >>> mlb.fit_transform([{'sci-fi', 'thriller'}, {'comedy'}])\n",
      "     |  array([[0, 1, 1],\n",
      "     |         [1, 0, 0]])\n",
      "     |  >>> list(mlb.classes_)\n",
      "     |  ['comedy', 'sci-fi', 'thriller']\n",
      "     |  \n",
      "     |  A common mistake is to pass in a list, which leads to the following issue:\n",
      "     |  \n",
      "     |  >>> mlb = MultiLabelBinarizer()\n",
      "     |  >>> mlb.fit(['sci-fi', 'thriller', 'comedy'])\n",
      "     |  MultiLabelBinarizer()\n",
      "     |  >>> mlb.classes_\n",
      "     |  array(['-', 'c', 'd', 'e', 'f', 'h', 'i', 'l', 'm', 'o', 'r', 's', 't',\n",
      "     |      'y'], dtype=object)\n",
      "     |  \n",
      "     |  To correct this, the list of labels should be passed in as:\n",
      "     |  \n",
      "     |  >>> mlb = MultiLabelBinarizer()\n",
      "     |  >>> mlb.fit([['sci-fi', 'thriller', 'comedy']])\n",
      "     |  MultiLabelBinarizer()\n",
      "     |  >>> mlb.classes_\n",
      "     |  array(['comedy', 'sci-fi', 'thriller'], dtype=object)\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  sklearn.preprocessing.OneHotEncoder : encode categorical features\n",
      "     |      using a one-hot aka one-of-K scheme.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      MultiLabelBinarizer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, classes=None, sparse_output=False)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, y)\n",
      "     |      Fit the label sets binarizer, storing :term:`classes_`\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : iterable of iterables\n",
      "     |          A set of labels (any orderable and hashable object) for each\n",
      "     |          sample. If the `classes` parameter is set, `y` will not be\n",
      "     |          iterated.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : returns this MultiLabelBinarizer instance\n",
      "     |  \n",
      "     |  fit_transform(self, y)\n",
      "     |      Fit the label sets binarizer and transform the given label sets\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : iterable of iterables\n",
      "     |          A set of labels (any orderable and hashable object) for each\n",
      "     |          sample. If the `classes` parameter is set, `y` will not be\n",
      "     |          iterated.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      y_indicator : array or CSR matrix, shape (n_samples, n_classes)\n",
      "     |          A matrix such that `y_indicator[i, j] = 1` iff `classes_[j]` is in\n",
      "     |          `y[i]`, and 0 otherwise.\n",
      "     |  \n",
      "     |  inverse_transform(self, yt)\n",
      "     |      Transform the given indicator matrix into label sets\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      yt : array or sparse matrix of shape (n_samples, n_classes)\n",
      "     |          A matrix containing only 1s ands 0s.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      y : list of tuples\n",
      "     |          The set of labels for each sample such that `y[i]` consists of\n",
      "     |          `classes_[j]` for each `yt[i, j] == 1`.\n",
      "     |  \n",
      "     |  transform(self, y)\n",
      "     |      Transform the given label sets\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      y : iterable of iterables\n",
      "     |          A set of labels (any orderable and hashable object) for each\n",
      "     |          sample. If the `classes` parameter is set, `y` will not be\n",
      "     |          iterated.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      y_indicator : array or CSR matrix, shape (n_samples, n_classes)\n",
      "     |          A matrix such that `y_indicator[i, j] = 1` iff `classes_[j]` is in\n",
      "     |          `y[i]`, and 0 otherwise.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class Normalizer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Normalize samples individually to unit norm.\n",
      "     |  \n",
      "     |  Each sample (i.e. each row of the data matrix) with at least one\n",
      "     |  non zero component is rescaled independently of other samples so\n",
      "     |  that its norm (l1, l2 or inf) equals one.\n",
      "     |  \n",
      "     |  This transformer is able to work both with dense numpy arrays and\n",
      "     |  scipy.sparse matrix (use CSR format if you want to avoid the burden of\n",
      "     |  a copy / conversion).\n",
      "     |  \n",
      "     |  Scaling inputs to unit norms is a common operation for text\n",
      "     |  classification or clustering for instance. For instance the dot\n",
      "     |  product of two l2-normalized TF-IDF vectors is the cosine similarity\n",
      "     |  of the vectors and is the base similarity metric for the Vector\n",
      "     |  Space Model commonly used by the Information Retrieval community.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_normalization>`.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  norm : 'l1', 'l2', or 'max', optional ('l2' by default)\n",
      "     |      The norm to use to normalize each non zero sample. If norm='max'\n",
      "     |      is used, values will be rescaled by the maximum of the absolute\n",
      "     |      values.\n",
      "     |  \n",
      "     |  copy : boolean, optional, default True\n",
      "     |      set to False to perform inplace row normalization and avoid a\n",
      "     |      copy (if the input is already a numpy array or a scipy.sparse\n",
      "     |      CSR matrix).\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn.preprocessing import Normalizer\n",
      "     |  >>> X = [[4, 1, 2, 2],\n",
      "     |  ...      [1, 3, 9, 3],\n",
      "     |  ...      [5, 7, 5, 1]]\n",
      "     |  >>> transformer = Normalizer().fit(X)  # fit does nothing.\n",
      "     |  >>> transformer\n",
      "     |  Normalizer()\n",
      "     |  >>> transformer.transform(X)\n",
      "     |  array([[0.8, 0.2, 0.4, 0.4],\n",
      "     |         [0.1, 0.3, 0.9, 0.3],\n",
      "     |         [0.5, 0.7, 0.5, 0.1]])\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  This estimator is stateless (besides constructor parameters), the\n",
      "     |  fit method does nothing but is useful when used in a pipeline.\n",
      "     |  \n",
      "     |  For a comparison of the different scalers, transformers, and normalizers,\n",
      "     |  see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "     |  <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "     |  \n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  normalize: Equivalent function without the estimator API.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      Normalizer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, norm='l2', *, copy=True)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Do nothing and return the estimator unchanged\n",
      "     |      \n",
      "     |      This method is just there to implement the usual API and hence\n",
      "     |      work in pipelines.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like\n",
      "     |  \n",
      "     |  transform(self, X, copy=None)\n",
      "     |      Scale each non zero row of X to unit norm\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "     |          The data to normalize, row by row. scipy.sparse matrices should be\n",
      "     |          in CSR format to avoid an un-necessary copy.\n",
      "     |      copy : bool, optional (default: None)\n",
      "     |          Copy the input X or not.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class OneHotEncoder(_BaseEncoder)\n",
      "     |  Encode categorical features as a one-hot numeric array.\n",
      "     |  \n",
      "     |  The input to this transformer should be an array-like of integers or\n",
      "     |  strings, denoting the values taken on by categorical (discrete) features.\n",
      "     |  The features are encoded using a one-hot (aka 'one-of-K' or 'dummy')\n",
      "     |  encoding scheme. This creates a binary column for each category and\n",
      "     |  returns a sparse matrix or dense array (depending on the ``sparse``\n",
      "     |  parameter)\n",
      "     |  \n",
      "     |  By default, the encoder derives the categories based on the unique values\n",
      "     |  in each feature. Alternatively, you can also specify the `categories`\n",
      "     |  manually.\n",
      "     |  \n",
      "     |  This encoding is needed for feeding categorical data to many scikit-learn\n",
      "     |  estimators, notably linear models and SVMs with the standard kernels.\n",
      "     |  \n",
      "     |  Note: a one-hot encoding of y labels should use a LabelBinarizer\n",
      "     |  instead.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_categorical_features>`.\n",
      "     |  \n",
      "     |  .. versionchanged:: 0.20\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  categories : 'auto' or a list of array-like, default='auto'\n",
      "     |      Categories (unique values) per feature:\n",
      "     |  \n",
      "     |      - 'auto' : Determine categories automatically from the training data.\n",
      "     |      - list : ``categories[i]`` holds the categories expected in the ith\n",
      "     |        column. The passed categories should not mix strings and numeric\n",
      "     |        values within a single feature, and should be sorted in case of\n",
      "     |        numeric values.\n",
      "     |  \n",
      "     |      The used categories can be found in the ``categories_`` attribute.\n",
      "     |  \n",
      "     |      .. versionadded:: 0.20\n",
      "     |  \n",
      "     |  drop : {'first', 'if_binary'} or a array-like of shape (n_features,),             default=None\n",
      "     |      Specifies a methodology to use to drop one of the categories per\n",
      "     |      feature. This is useful in situations where perfectly collinear\n",
      "     |      features cause problems, such as when feeding the resulting data\n",
      "     |      into a neural network or an unregularized regression.\n",
      "     |  \n",
      "     |      However, dropping one category breaks the symmetry of the original\n",
      "     |      representation and can therefore induce a bias in downstream models,\n",
      "     |      for instance for penalized linear classification or regression models.\n",
      "     |  \n",
      "     |      - None : retain all features (the default).\n",
      "     |      - 'first' : drop the first category in each feature. If only one\n",
      "     |        category is present, the feature will be dropped entirely.\n",
      "     |      - 'if_binary' : drop the first category in each feature with two\n",
      "     |        categories. Features with 1 or more than 2 categories are\n",
      "     |        left intact.\n",
      "     |      - array : ``drop[i]`` is the category in feature ``X[:, i]`` that\n",
      "     |        should be dropped.\n",
      "     |  \n",
      "     |  sparse : bool, default=True\n",
      "     |      Will return sparse matrix if set True else will return an array.\n",
      "     |  \n",
      "     |  dtype : number type, default=np.float\n",
      "     |      Desired dtype of output.\n",
      "     |  \n",
      "     |  handle_unknown : {'error', 'ignore'}, default='error'\n",
      "     |      Whether to raise an error or ignore if an unknown categorical feature\n",
      "     |      is present during transform (default is to raise). When this parameter\n",
      "     |      is set to 'ignore' and an unknown category is encountered during\n",
      "     |      transform, the resulting one-hot encoded columns for this feature\n",
      "     |      will be all zeros. In the inverse transform, an unknown category\n",
      "     |      will be denoted as None.\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  categories_ : list of arrays\n",
      "     |      The categories of each feature determined during fitting\n",
      "     |      (in order of the features in X and corresponding with the output\n",
      "     |      of ``transform``). This includes the category specified in ``drop``\n",
      "     |      (if any).\n",
      "     |  \n",
      "     |  drop_idx_ : array of shape (n_features,)\n",
      "     |      - ``drop_idx_[i]`` is the index in ``categories_[i]`` of the category\n",
      "     |        to be dropped for each feature.\n",
      "     |      - ``drop_idx_[i] = None`` if no category is to be dropped from the\n",
      "     |        feature with index ``i``, e.g. when `drop='if_binary'` and the\n",
      "     |        feature isn't binary.\n",
      "     |      - ``drop_idx_ = None`` if all the transformed features will be\n",
      "     |        retained.\n",
      "     |  \n",
      "     |  See Also\n",
      "     |  --------\n",
      "     |  sklearn.preprocessing.OrdinalEncoder : Performs an ordinal (integer)\n",
      "     |    encoding of the categorical features.\n",
      "     |  sklearn.feature_extraction.DictVectorizer : Performs a one-hot encoding of\n",
      "     |    dictionary items (also handles string-valued features).\n",
      "     |  sklearn.feature_extraction.FeatureHasher : Performs an approximate one-hot\n",
      "     |    encoding of dictionary items or strings.\n",
      "     |  sklearn.preprocessing.LabelBinarizer : Binarizes labels in a one-vs-all\n",
      "     |    fashion.\n",
      "     |  sklearn.preprocessing.MultiLabelBinarizer : Transforms between iterable of\n",
      "     |    iterables and a multilabel format, e.g. a (samples x classes) binary\n",
      "     |    matrix indicating the presence of a class label.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  Given a dataset with two features, we let the encoder find the unique\n",
      "     |  values per feature and transform the data to a binary one-hot encoding.\n",
      "     |  \n",
      "     |  >>> from sklearn.preprocessing import OneHotEncoder\n",
      "     |  \n",
      "     |  One can discard categories not seen during `fit`:\n",
      "     |  \n",
      "     |  >>> enc = OneHotEncoder(handle_unknown='ignore')\n",
      "     |  >>> X = [['Male', 1], ['Female', 3], ['Female', 2]]\n",
      "     |  >>> enc.fit(X)\n",
      "     |  OneHotEncoder(handle_unknown='ignore')\n",
      "     |  >>> enc.categories_\n",
      "     |  [array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]\n",
      "     |  >>> enc.transform([['Female', 1], ['Male', 4]]).toarray()\n",
      "     |  array([[1., 0., 1., 0., 0.],\n",
      "     |         [0., 1., 0., 0., 0.]])\n",
      "     |  >>> enc.inverse_transform([[0, 1, 1, 0, 0], [0, 0, 0, 1, 0]])\n",
      "     |  array([['Male', 1],\n",
      "     |         [None, 2]], dtype=object)\n",
      "     |  >>> enc.get_feature_names(['gender', 'group'])\n",
      "     |  array(['gender_Female', 'gender_Male', 'group_1', 'group_2', 'group_3'],\n",
      "     |    dtype=object)\n",
      "     |  \n",
      "     |  One can always drop the first column for each feature:\n",
      "     |  \n",
      "     |  >>> drop_enc = OneHotEncoder(drop='first').fit(X)\n",
      "     |  >>> drop_enc.categories_\n",
      "     |  [array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]\n",
      "     |  >>> drop_enc.transform([['Female', 1], ['Male', 2]]).toarray()\n",
      "     |  array([[0., 0., 0.],\n",
      "     |         [1., 1., 0.]])\n",
      "     |  \n",
      "     |  Or drop a column for feature only having 2 categories:\n",
      "     |  \n",
      "     |  >>> drop_binary_enc = OneHotEncoder(drop='if_binary').fit(X)\n",
      "     |  >>> drop_binary_enc.transform([['Female', 1], ['Male', 2]]).toarray()\n",
      "     |  array([[0., 1., 0., 0.],\n",
      "     |         [1., 0., 1., 0.]])\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      OneHotEncoder\n",
      "     |      _BaseEncoder\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, categories='auto', drop=None, sparse=True, dtype=<class 'numpy.float64'>, handle_unknown='error')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Fit OneHotEncoder to X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape [n_samples, n_features]\n",
      "     |          The data to determine the categories of each feature.\n",
      "     |      \n",
      "     |      y : None\n",
      "     |          Ignored. This parameter exists only for compatibility with\n",
      "     |          :class:`sklearn.pipeline.Pipeline`.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None)\n",
      "     |      Fit OneHotEncoder to X, then transform X.\n",
      "     |      \n",
      "     |      Equivalent to fit(X).transform(X) but more convenient.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape [n_samples, n_features]\n",
      "     |          The data to encode.\n",
      "     |      \n",
      "     |      y : None\n",
      "     |          Ignored. This parameter exists only for compatibility with\n",
      "     |          :class:`sklearn.pipeline.Pipeline`.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_out : sparse matrix if sparse=True else a 2-d array\n",
      "     |          Transformed input.\n",
      "     |  \n",
      "     |  get_feature_names(self, input_features=None)\n",
      "     |      Return feature names for output features.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      input_features : list of str of shape (n_features,)\n",
      "     |          String names for input features if available. By default,\n",
      "     |          \"x0\", \"x1\", ... \"xn_features\" is used.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      output_feature_names : ndarray of shape (n_output_features,)\n",
      "     |          Array of feature names.\n",
      "     |  \n",
      "     |  inverse_transform(self, X)\n",
      "     |      Convert the data back to the original representation.\n",
      "     |      \n",
      "     |      In case unknown categories are encountered (all zeros in the\n",
      "     |      one-hot encoding), ``None`` is used to represent this category.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like or sparse matrix, shape [n_samples, n_encoded_features]\n",
      "     |          The transformed data.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_tr : array-like, shape [n_samples, n_features]\n",
      "     |          Inverse transformed array.\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Transform X using one-hot encoding.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape [n_samples, n_features]\n",
      "     |          The data to encode.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_out : sparse matrix if sparse=True else a 2-d array\n",
      "     |          Transformed input.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class OrdinalEncoder(_BaseEncoder)\n",
      "     |  Encode categorical features as an integer array.\n",
      "     |  \n",
      "     |  The input to this transformer should be an array-like of integers or\n",
      "     |  strings, denoting the values taken on by categorical (discrete) features.\n",
      "     |  The features are converted to ordinal integers. This results in\n",
      "     |  a single column of integers (0 to n_categories - 1) per feature.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_categorical_features>`.\n",
      "     |  \n",
      "     |  .. versionadded:: 0.20\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  categories : 'auto' or a list of array-like, default='auto'\n",
      "     |      Categories (unique values) per feature:\n",
      "     |  \n",
      "     |      - 'auto' : Determine categories automatically from the training data.\n",
      "     |      - list : ``categories[i]`` holds the categories expected in the ith\n",
      "     |        column. The passed categories should not mix strings and numeric\n",
      "     |        values, and should be sorted in case of numeric values.\n",
      "     |  \n",
      "     |      The used categories can be found in the ``categories_`` attribute.\n",
      "     |  \n",
      "     |  dtype : number type, default np.float64\n",
      "     |      Desired dtype of output.\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  categories_ : list of arrays\n",
      "     |      The categories of each feature determined during fitting\n",
      "     |      (in order of the features in X and corresponding with the output\n",
      "     |      of ``transform``).\n",
      "     |  \n",
      "     |  See Also\n",
      "     |  --------\n",
      "     |  sklearn.preprocessing.OneHotEncoder : Performs a one-hot encoding of\n",
      "     |    categorical features.\n",
      "     |  sklearn.preprocessing.LabelEncoder : Encodes target labels with values\n",
      "     |    between 0 and n_classes-1.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  Given a dataset with two features, we let the encoder find the unique\n",
      "     |  values per feature and transform the data to an ordinal encoding.\n",
      "     |  \n",
      "     |  >>> from sklearn.preprocessing import OrdinalEncoder\n",
      "     |  >>> enc = OrdinalEncoder()\n",
      "     |  >>> X = [['Male', 1], ['Female', 3], ['Female', 2]]\n",
      "     |  >>> enc.fit(X)\n",
      "     |  OrdinalEncoder()\n",
      "     |  >>> enc.categories_\n",
      "     |  [array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]\n",
      "     |  >>> enc.transform([['Female', 3], ['Male', 1]])\n",
      "     |  array([[0., 2.],\n",
      "     |         [1., 0.]])\n",
      "     |  \n",
      "     |  >>> enc.inverse_transform([[1, 0], [0, 1]])\n",
      "     |  array([['Male', 1],\n",
      "     |         ['Female', 2]], dtype=object)\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      OrdinalEncoder\n",
      "     |      _BaseEncoder\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, categories='auto', dtype=<class 'numpy.float64'>)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Fit the OrdinalEncoder to X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape [n_samples, n_features]\n",
      "     |          The data to determine the categories of each feature.\n",
      "     |      \n",
      "     |      y : None\n",
      "     |          Ignored. This parameter exists only for compatibility with\n",
      "     |          :class:`sklearn.pipeline.Pipeline`.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self\n",
      "     |  \n",
      "     |  inverse_transform(self, X)\n",
      "     |      Convert the data back to the original representation.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like or sparse matrix, shape [n_samples, n_encoded_features]\n",
      "     |          The transformed data.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_tr : array-like, shape [n_samples, n_features]\n",
      "     |          Inverse transformed array.\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Transform X to ordinal codes.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape [n_samples, n_features]\n",
      "     |          The data to encode.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_out : sparse matrix or a 2-d array\n",
      "     |          Transformed input.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class PolynomialFeatures(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Generate polynomial and interaction features.\n",
      "     |  \n",
      "     |  Generate a new feature matrix consisting of all polynomial combinations\n",
      "     |  of the features with degree less than or equal to the specified degree.\n",
      "     |  For example, if an input sample is two dimensional and of the form\n",
      "     |  [a, b], the degree-2 polynomial features are [1, a, b, a^2, ab, b^2].\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  degree : integer\n",
      "     |      The degree of the polynomial features. Default = 2.\n",
      "     |  \n",
      "     |  interaction_only : boolean, default = False\n",
      "     |      If true, only interaction features are produced: features that are\n",
      "     |      products of at most ``degree`` *distinct* input features (so not\n",
      "     |      ``x[1] ** 2``, ``x[0] * x[2] ** 3``, etc.).\n",
      "     |  \n",
      "     |  include_bias : boolean\n",
      "     |      If True (default), then include a bias column, the feature in which\n",
      "     |      all polynomial powers are zero (i.e. a column of ones - acts as an\n",
      "     |      intercept term in a linear model).\n",
      "     |  \n",
      "     |  order : str in {'C', 'F'}, default 'C'\n",
      "     |      Order of output array in the dense case. 'F' order is faster to\n",
      "     |      compute, but may slow down subsequent estimators.\n",
      "     |  \n",
      "     |      .. versionadded:: 0.21\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> import numpy as np\n",
      "     |  >>> from sklearn.preprocessing import PolynomialFeatures\n",
      "     |  >>> X = np.arange(6).reshape(3, 2)\n",
      "     |  >>> X\n",
      "     |  array([[0, 1],\n",
      "     |         [2, 3],\n",
      "     |         [4, 5]])\n",
      "     |  >>> poly = PolynomialFeatures(2)\n",
      "     |  >>> poly.fit_transform(X)\n",
      "     |  array([[ 1.,  0.,  1.,  0.,  0.,  1.],\n",
      "     |         [ 1.,  2.,  3.,  4.,  6.,  9.],\n",
      "     |         [ 1.,  4.,  5., 16., 20., 25.]])\n",
      "     |  >>> poly = PolynomialFeatures(interaction_only=True)\n",
      "     |  >>> poly.fit_transform(X)\n",
      "     |  array([[ 1.,  0.,  1.,  0.],\n",
      "     |         [ 1.,  2.,  3.,  6.],\n",
      "     |         [ 1.,  4.,  5., 20.]])\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  powers_ : array, shape (n_output_features, n_input_features)\n",
      "     |      powers_[i, j] is the exponent of the jth input in the ith output.\n",
      "     |  \n",
      "     |  n_input_features_ : int\n",
      "     |      The total number of input features.\n",
      "     |  \n",
      "     |  n_output_features_ : int\n",
      "     |      The total number of polynomial output features. The number of output\n",
      "     |      features is computed by iterating over all suitably sized combinations\n",
      "     |      of input features.\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  Be aware that the number of features in the output array scales\n",
      "     |  polynomially in the number of features of the input array, and\n",
      "     |  exponentially in the degree. High degrees can cause overfitting.\n",
      "     |  \n",
      "     |  See :ref:`examples/linear_model/plot_polynomial_interpolation.py\n",
      "     |  <sphx_glr_auto_examples_linear_model_plot_polynomial_interpolation.py>`\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      PolynomialFeatures\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, degree=2, *, interaction_only=False, include_bias=True, order='C')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Compute number of output features.\n",
      "     |      \n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape (n_samples, n_features)\n",
      "     |          The data.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : instance\n",
      "     |  \n",
      "     |  get_feature_names(self, input_features=None)\n",
      "     |      Return feature names for output features\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      input_features : list of string, length n_features, optional\n",
      "     |          String names for input features if available. By default,\n",
      "     |          \"x0\", \"x1\", ... \"xn_features\" is used.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      output_feature_names : list of string, length n_output_features\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Transform data to polynomial features\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like or CSR/CSC sparse matrix, shape [n_samples, n_features]\n",
      "     |          The data to transform, row by row.\n",
      "     |      \n",
      "     |          Prefer CSR over CSC for sparse input (for speed), but CSC is\n",
      "     |          required if the degree is 4 or higher. If the degree is less than\n",
      "     |          4 and the input format is CSC, it will be converted to CSR, have\n",
      "     |          its polynomial features generated, then converted back to CSC.\n",
      "     |      \n",
      "     |          If the degree is 2 or 3, the method described in \"Leveraging\n",
      "     |          Sparsity to Speed Up Polynomial Feature Expansions of CSR Matrices\n",
      "     |          Using K-Simplex Numbers\" by Andrew Nystrom and John Hughes is\n",
      "     |          used, which is much faster than the method used on CSC input. For\n",
      "     |          this reason, a CSC input will be converted to CSR, and the output\n",
      "     |          will be converted back to CSC prior to being returned, hence the\n",
      "     |          preference of CSR.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      XP : np.ndarray or CSR/CSC sparse matrix, shape [n_samples, NP]\n",
      "     |          The matrix of features, where NP is the number of polynomial\n",
      "     |          features generated from the combination of inputs.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors defined here:\n",
      "     |  \n",
      "     |  powers_\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class PowerTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Apply a power transform featurewise to make data more Gaussian-like.\n",
      "     |  \n",
      "     |  Power transforms are a family of parametric, monotonic transformations\n",
      "     |  that are applied to make data more Gaussian-like. This is useful for\n",
      "     |  modeling issues related to heteroscedasticity (non-constant variance),\n",
      "     |  or other situations where normality is desired.\n",
      "     |  \n",
      "     |  Currently, PowerTransformer supports the Box-Cox transform and the\n",
      "     |  Yeo-Johnson transform. The optimal parameter for stabilizing variance and\n",
      "     |  minimizing skewness is estimated through maximum likelihood.\n",
      "     |  \n",
      "     |  Box-Cox requires input data to be strictly positive, while Yeo-Johnson\n",
      "     |  supports both positive or negative data.\n",
      "     |  \n",
      "     |  By default, zero-mean, unit-variance normalization is applied to the\n",
      "     |  transformed data.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_transformer>`.\n",
      "     |  \n",
      "     |  .. versionadded:: 0.20\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  method : str, (default='yeo-johnson')\n",
      "     |      The power transform method. Available methods are:\n",
      "     |  \n",
      "     |      - 'yeo-johnson' [1]_, works with positive and negative values\n",
      "     |      - 'box-cox' [2]_, only works with strictly positive values\n",
      "     |  \n",
      "     |  standardize : boolean, default=True\n",
      "     |      Set to True to apply zero-mean, unit-variance normalization to the\n",
      "     |      transformed output.\n",
      "     |  \n",
      "     |  copy : boolean, optional, default=True\n",
      "     |      Set to False to perform inplace computation during transformation.\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  lambdas_ : array of float, shape (n_features,)\n",
      "     |      The parameters of the power transformation for the selected features.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> import numpy as np\n",
      "     |  >>> from sklearn.preprocessing import PowerTransformer\n",
      "     |  >>> pt = PowerTransformer()\n",
      "     |  >>> data = [[1, 2], [3, 2], [4, 5]]\n",
      "     |  >>> print(pt.fit(data))\n",
      "     |  PowerTransformer()\n",
      "     |  >>> print(pt.lambdas_)\n",
      "     |  [ 1.386... -3.100...]\n",
      "     |  >>> print(pt.transform(data))\n",
      "     |  [[-1.316... -0.707...]\n",
      "     |   [ 0.209... -0.707...]\n",
      "     |   [ 1.106...  1.414...]]\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  power_transform : Equivalent function without the estimator API.\n",
      "     |  \n",
      "     |  QuantileTransformer : Maps data to a standard normal distribution with\n",
      "     |      the parameter `output_distribution='normal'`.\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  NaNs are treated as missing values: disregarded in ``fit``, and maintained\n",
      "     |  in ``transform``.\n",
      "     |  \n",
      "     |  For a comparison of the different scalers, transformers, and normalizers,\n",
      "     |  see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "     |  <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] I.K. Yeo and R.A. Johnson, \"A new family of power transformations to\n",
      "     |         improve normality or symmetry.\" Biometrika, 87(4), pp.954-959,\n",
      "     |         (2000).\n",
      "     |  \n",
      "     |  .. [2] G.E.P. Box and D.R. Cox, \"An Analysis of Transformations\", Journal\n",
      "     |         of the Royal Statistical Society B, 26, 211-252 (1964).\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      PowerTransformer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, method='yeo-johnson', *, standardize=True, copy=True)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Estimate the optimal parameter lambda for each feature.\n",
      "     |      \n",
      "     |      The optimal lambda parameter for minimizing skewness is estimated on\n",
      "     |      each feature independently using maximum likelihood.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape (n_samples, n_features)\n",
      "     |          The data used to estimate the optimal transformation parameters.\n",
      "     |      \n",
      "     |      y : Ignored\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  inverse_transform(self, X)\n",
      "     |      Apply the inverse power transformation using the fitted lambdas.\n",
      "     |      \n",
      "     |      The inverse of the Box-Cox transformation is given by::\n",
      "     |      \n",
      "     |          if lambda_ == 0:\n",
      "     |              X = exp(X_trans)\n",
      "     |          else:\n",
      "     |              X = (X_trans * lambda_ + 1) ** (1 / lambda_)\n",
      "     |      \n",
      "     |      The inverse of the Yeo-Johnson transformation is given by::\n",
      "     |      \n",
      "     |          if X >= 0 and lambda_ == 0:\n",
      "     |              X = exp(X_trans) - 1\n",
      "     |          elif X >= 0 and lambda_ != 0:\n",
      "     |              X = (X_trans * lambda_ + 1) ** (1 / lambda_) - 1\n",
      "     |          elif X < 0 and lambda_ != 2:\n",
      "     |              X = 1 - (-(2 - lambda_) * X_trans + 1) ** (1 / (2 - lambda_))\n",
      "     |          elif X < 0 and lambda_ == 2:\n",
      "     |              X = 1 - exp(-X_trans)\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape (n_samples, n_features)\n",
      "     |          The transformed data.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X : array-like, shape (n_samples, n_features)\n",
      "     |          The original data\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Apply the power transform to each feature using the fitted lambdas.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape (n_samples, n_features)\n",
      "     |          The data to be transformed using a power transformation.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_trans : array-like, shape (n_samples, n_features)\n",
      "     |          The transformed data.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class QuantileTransformer(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Transform features using quantiles information.\n",
      "     |  \n",
      "     |  This method transforms the features to follow a uniform or a normal\n",
      "     |  distribution. Therefore, for a given feature, this transformation tends\n",
      "     |  to spread out the most frequent values. It also reduces the impact of\n",
      "     |  (marginal) outliers: this is therefore a robust preprocessing scheme.\n",
      "     |  \n",
      "     |  The transformation is applied on each feature independently. First an\n",
      "     |  estimate of the cumulative distribution function of a feature is\n",
      "     |  used to map the original values to a uniform distribution. The obtained\n",
      "     |  values are then mapped to the desired output distribution using the\n",
      "     |  associated quantile function. Features values of new/unseen data that fall\n",
      "     |  below or above the fitted range will be mapped to the bounds of the output\n",
      "     |  distribution. Note that this transform is non-linear. It may distort linear\n",
      "     |  correlations between variables measured at the same scale but renders\n",
      "     |  variables measured at different scales more directly comparable.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_transformer>`.\n",
      "     |  \n",
      "     |  .. versionadded:: 0.19\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  n_quantiles : int, optional (default=1000 or n_samples)\n",
      "     |      Number of quantiles to be computed. It corresponds to the number\n",
      "     |      of landmarks used to discretize the cumulative distribution function.\n",
      "     |      If n_quantiles is larger than the number of samples, n_quantiles is set\n",
      "     |      to the number of samples as a larger number of quantiles does not give\n",
      "     |      a better approximation of the cumulative distribution function\n",
      "     |      estimator.\n",
      "     |  \n",
      "     |  output_distribution : str, optional (default='uniform')\n",
      "     |      Marginal distribution for the transformed data. The choices are\n",
      "     |      'uniform' (default) or 'normal'.\n",
      "     |  \n",
      "     |  ignore_implicit_zeros : bool, optional (default=False)\n",
      "     |      Only applies to sparse matrices. If True, the sparse entries of the\n",
      "     |      matrix are discarded to compute the quantile statistics. If False,\n",
      "     |      these entries are treated as zeros.\n",
      "     |  \n",
      "     |  subsample : int, optional (default=1e5)\n",
      "     |      Maximum number of samples used to estimate the quantiles for\n",
      "     |      computational efficiency. Note that the subsampling procedure may\n",
      "     |      differ for value-identical sparse and dense matrices.\n",
      "     |  \n",
      "     |  random_state : int, RandomState instance or None, optional (default=None)\n",
      "     |      Determines random number generation for subsampling and smoothing\n",
      "     |      noise.\n",
      "     |      Please see ``subsample`` for more details.\n",
      "     |      Pass an int for reproducible results across multiple function calls.\n",
      "     |      See :term:`Glossary <random_state>`\n",
      "     |  \n",
      "     |  copy : boolean, optional, (default=True)\n",
      "     |      Set to False to perform inplace transformation and avoid a copy (if the\n",
      "     |      input is already a numpy array).\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  n_quantiles_ : integer\n",
      "     |      The actual number of quantiles used to discretize the cumulative\n",
      "     |      distribution function.\n",
      "     |  \n",
      "     |  quantiles_ : ndarray, shape (n_quantiles, n_features)\n",
      "     |      The values corresponding the quantiles of reference.\n",
      "     |  \n",
      "     |  references_ : ndarray, shape(n_quantiles, )\n",
      "     |      Quantiles of references.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> import numpy as np\n",
      "     |  >>> from sklearn.preprocessing import QuantileTransformer\n",
      "     |  >>> rng = np.random.RandomState(0)\n",
      "     |  >>> X = np.sort(rng.normal(loc=0.5, scale=0.25, size=(25, 1)), axis=0)\n",
      "     |  >>> qt = QuantileTransformer(n_quantiles=10, random_state=0)\n",
      "     |  >>> qt.fit_transform(X)\n",
      "     |  array([...])\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  quantile_transform : Equivalent function without the estimator API.\n",
      "     |  PowerTransformer : Perform mapping to a normal distribution using a power\n",
      "     |      transform.\n",
      "     |  StandardScaler : Perform standardization that is faster, but less robust\n",
      "     |      to outliers.\n",
      "     |  RobustScaler : Perform robust standardization that removes the influence\n",
      "     |      of outliers but does not put outliers and inliers on the same scale.\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  NaNs are treated as missing values: disregarded in fit, and maintained in\n",
      "     |  transform.\n",
      "     |  \n",
      "     |  For a comparison of the different scalers, transformers, and normalizers,\n",
      "     |  see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "     |  <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      QuantileTransformer\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, n_quantiles=1000, output_distribution='uniform', ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=True)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Compute the quantiles used for transforming.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : ndarray or sparse matrix, shape (n_samples, n_features)\n",
      "     |          The data used to scale along the features axis. If a sparse\n",
      "     |          matrix is provided, it will be converted into a sparse\n",
      "     |          ``csc_matrix``. Additionally, the sparse matrix needs to be\n",
      "     |          nonnegative if `ignore_implicit_zeros` is False.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |  \n",
      "     |  inverse_transform(self, X)\n",
      "     |      Back-projection to the original space.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : ndarray or sparse matrix, shape (n_samples, n_features)\n",
      "     |          The data used to scale along the features axis. If a sparse\n",
      "     |          matrix is provided, it will be converted into a sparse\n",
      "     |          ``csc_matrix``. Additionally, the sparse matrix needs to be\n",
      "     |          nonnegative if `ignore_implicit_zeros` is False.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      Xt : ndarray or sparse matrix, shape (n_samples, n_features)\n",
      "     |          The projected data.\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Feature-wise transformation of the data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : ndarray or sparse matrix, shape (n_samples, n_features)\n",
      "     |          The data used to scale along the features axis. If a sparse\n",
      "     |          matrix is provided, it will be converted into a sparse\n",
      "     |          ``csc_matrix``. Additionally, the sparse matrix needs to be\n",
      "     |          nonnegative if `ignore_implicit_zeros` is False.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      Xt : ndarray or sparse matrix, shape (n_samples, n_features)\n",
      "     |          The projected data.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class RobustScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Scale features using statistics that are robust to outliers.\n",
      "     |  \n",
      "     |  This Scaler removes the median and scales the data according to\n",
      "     |  the quantile range (defaults to IQR: Interquartile Range).\n",
      "     |  The IQR is the range between the 1st quartile (25th quantile)\n",
      "     |  and the 3rd quartile (75th quantile).\n",
      "     |  \n",
      "     |  Centering and scaling happen independently on each feature by\n",
      "     |  computing the relevant statistics on the samples in the training\n",
      "     |  set. Median and interquartile range are then stored to be used on\n",
      "     |  later data using the ``transform`` method.\n",
      "     |  \n",
      "     |  Standardization of a dataset is a common requirement for many\n",
      "     |  machine learning estimators. Typically this is done by removing the mean\n",
      "     |  and scaling to unit variance. However, outliers can often influence the\n",
      "     |  sample mean / variance in a negative way. In such cases, the median and\n",
      "     |  the interquartile range often give better results.\n",
      "     |  \n",
      "     |  .. versionadded:: 0.17\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_scaler>`.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  with_centering : boolean, True by default\n",
      "     |      If True, center the data before scaling.\n",
      "     |      This will cause ``transform`` to raise an exception when attempted on\n",
      "     |      sparse matrices, because centering them entails building a dense\n",
      "     |      matrix which in common use cases is likely to be too large to fit in\n",
      "     |      memory.\n",
      "     |  \n",
      "     |  with_scaling : boolean, True by default\n",
      "     |      If True, scale the data to interquartile range.\n",
      "     |  \n",
      "     |  quantile_range : tuple (q_min, q_max), 0.0 < q_min < q_max < 100.0\n",
      "     |      Default: (25.0, 75.0) = (1st quantile, 3rd quantile) = IQR\n",
      "     |      Quantile range used to calculate ``scale_``.\n",
      "     |  \n",
      "     |      .. versionadded:: 0.18\n",
      "     |  \n",
      "     |  copy : boolean, optional, default is True\n",
      "     |      If False, try to avoid a copy and do inplace scaling instead.\n",
      "     |      This is not guaranteed to always work inplace; e.g. if the data is\n",
      "     |      not a NumPy array or scipy.sparse CSR matrix, a copy may still be\n",
      "     |      returned.\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  center_ : array of floats\n",
      "     |      The median value for each feature in the training set.\n",
      "     |  \n",
      "     |  scale_ : array of floats\n",
      "     |      The (scaled) interquartile range for each feature in the training set.\n",
      "     |  \n",
      "     |      .. versionadded:: 0.17\n",
      "     |         *scale_* attribute.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn.preprocessing import RobustScaler\n",
      "     |  >>> X = [[ 1., -2.,  2.],\n",
      "     |  ...      [ -2.,  1.,  3.],\n",
      "     |  ...      [ 4.,  1., -2.]]\n",
      "     |  >>> transformer = RobustScaler().fit(X)\n",
      "     |  >>> transformer\n",
      "     |  RobustScaler()\n",
      "     |  >>> transformer.transform(X)\n",
      "     |  array([[ 0. , -2. ,  0. ],\n",
      "     |         [-1. ,  0. ,  0.4],\n",
      "     |         [ 1. ,  0. , -1.6]])\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  robust_scale: Equivalent function without the estimator API.\n",
      "     |  \n",
      "     |  :class:`sklearn.decomposition.PCA`\n",
      "     |      Further removes the linear correlation across features with\n",
      "     |      'whiten=True'.\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  For a comparison of the different scalers, transformers, and normalizers,\n",
      "     |  see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "     |  <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "     |  \n",
      "     |  https://en.wikipedia.org/wiki/Median\n",
      "     |  https://en.wikipedia.org/wiki/Interquartile_range\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      RobustScaler\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Compute the median and quantiles to be used for scaling.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape [n_samples, n_features]\n",
      "     |          The data used to compute the median and quantiles\n",
      "     |          used for later scaling along the features axis.\n",
      "     |  \n",
      "     |  inverse_transform(self, X)\n",
      "     |      Scale back the data to the original representation\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like\n",
      "     |          The data used to scale along the specified axis.\n",
      "     |  \n",
      "     |  transform(self, X)\n",
      "     |      Center and scale the data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}\n",
      "     |          The data used to scale along the specified axis.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "    \n",
      "    class StandardScaler(sklearn.base.TransformerMixin, sklearn.base.BaseEstimator)\n",
      "     |  Standardize features by removing the mean and scaling to unit variance\n",
      "     |  \n",
      "     |  The standard score of a sample `x` is calculated as:\n",
      "     |  \n",
      "     |      z = (x - u) / s\n",
      "     |  \n",
      "     |  where `u` is the mean of the training samples or zero if `with_mean=False`,\n",
      "     |  and `s` is the standard deviation of the training samples or one if\n",
      "     |  `with_std=False`.\n",
      "     |  \n",
      "     |  Centering and scaling happen independently on each feature by computing\n",
      "     |  the relevant statistics on the samples in the training set. Mean and\n",
      "     |  standard deviation are then stored to be used on later data using\n",
      "     |  :meth:`transform`.\n",
      "     |  \n",
      "     |  Standardization of a dataset is a common requirement for many\n",
      "     |  machine learning estimators: they might behave badly if the\n",
      "     |  individual features do not more or less look like standard normally\n",
      "     |  distributed data (e.g. Gaussian with 0 mean and unit variance).\n",
      "     |  \n",
      "     |  For instance many elements used in the objective function of\n",
      "     |  a learning algorithm (such as the RBF kernel of Support Vector\n",
      "     |  Machines or the L1 and L2 regularizers of linear models) assume that\n",
      "     |  all features are centered around 0 and have variance in the same\n",
      "     |  order. If a feature has a variance that is orders of magnitude larger\n",
      "     |  that others, it might dominate the objective function and make the\n",
      "     |  estimator unable to learn from other features correctly as expected.\n",
      "     |  \n",
      "     |  This scaler can also be applied to sparse CSR or CSC matrices by passing\n",
      "     |  `with_mean=False` to avoid breaking the sparsity structure of the data.\n",
      "     |  \n",
      "     |  Read more in the :ref:`User Guide <preprocessing_scaler>`.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  copy : boolean, optional, default True\n",
      "     |      If False, try to avoid a copy and do inplace scaling instead.\n",
      "     |      This is not guaranteed to always work inplace; e.g. if the data is\n",
      "     |      not a NumPy array or scipy.sparse CSR matrix, a copy may still be\n",
      "     |      returned.\n",
      "     |  \n",
      "     |  with_mean : boolean, True by default\n",
      "     |      If True, center the data before scaling.\n",
      "     |      This does not work (and will raise an exception) when attempted on\n",
      "     |      sparse matrices, because centering them entails building a dense\n",
      "     |      matrix which in common use cases is likely to be too large to fit in\n",
      "     |      memory.\n",
      "     |  \n",
      "     |  with_std : boolean, True by default\n",
      "     |      If True, scale the data to unit variance (or equivalently,\n",
      "     |      unit standard deviation).\n",
      "     |  \n",
      "     |  Attributes\n",
      "     |  ----------\n",
      "     |  scale_ : ndarray or None, shape (n_features,)\n",
      "     |      Per feature relative scaling of the data. This is calculated using\n",
      "     |      `np.sqrt(var_)`. Equal to ``None`` when ``with_std=False``.\n",
      "     |  \n",
      "     |      .. versionadded:: 0.17\n",
      "     |         *scale_*\n",
      "     |  \n",
      "     |  mean_ : ndarray or None, shape (n_features,)\n",
      "     |      The mean value for each feature in the training set.\n",
      "     |      Equal to ``None`` when ``with_mean=False``.\n",
      "     |  \n",
      "     |  var_ : ndarray or None, shape (n_features,)\n",
      "     |      The variance for each feature in the training set. Used to compute\n",
      "     |      `scale_`. Equal to ``None`` when ``with_std=False``.\n",
      "     |  \n",
      "     |  n_samples_seen_ : int or array, shape (n_features,)\n",
      "     |      The number of samples processed by the estimator for each feature.\n",
      "     |      If there are not missing samples, the ``n_samples_seen`` will be an\n",
      "     |      integer, otherwise it will be an array.\n",
      "     |      Will be reset on new calls to fit, but increments across\n",
      "     |      ``partial_fit`` calls.\n",
      "     |  \n",
      "     |  Examples\n",
      "     |  --------\n",
      "     |  >>> from sklearn.preprocessing import StandardScaler\n",
      "     |  >>> data = [[0, 0], [0, 0], [1, 1], [1, 1]]\n",
      "     |  >>> scaler = StandardScaler()\n",
      "     |  >>> print(scaler.fit(data))\n",
      "     |  StandardScaler()\n",
      "     |  >>> print(scaler.mean_)\n",
      "     |  [0.5 0.5]\n",
      "     |  >>> print(scaler.transform(data))\n",
      "     |  [[-1. -1.]\n",
      "     |   [-1. -1.]\n",
      "     |   [ 1.  1.]\n",
      "     |   [ 1.  1.]]\n",
      "     |  >>> print(scaler.transform([[2, 2]]))\n",
      "     |  [[3. 3.]]\n",
      "     |  \n",
      "     |  See also\n",
      "     |  --------\n",
      "     |  scale: Equivalent function without the estimator API.\n",
      "     |  \n",
      "     |  :class:`sklearn.decomposition.PCA`\n",
      "     |      Further removes the linear correlation across features with 'whiten=True'.\n",
      "     |  \n",
      "     |  Notes\n",
      "     |  -----\n",
      "     |  NaNs are treated as missing values: disregarded in fit, and maintained in\n",
      "     |  transform.\n",
      "     |  \n",
      "     |  We use a biased estimator for the standard deviation, equivalent to\n",
      "     |  `numpy.std(x, ddof=0)`. Note that the choice of `ddof` is unlikely to\n",
      "     |  affect model performance.\n",
      "     |  \n",
      "     |  For a comparison of the different scalers, transformers, and normalizers,\n",
      "     |  see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "     |  <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      StandardScaler\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, *, copy=True, with_mean=True, with_std=True)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None)\n",
      "     |      Compute the mean and std to be used for later scaling.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "     |          The data used to compute the mean and standard deviation\n",
      "     |          used for later scaling along the features axis.\n",
      "     |      \n",
      "     |      y\n",
      "     |          Ignored\n",
      "     |  \n",
      "     |  inverse_transform(self, X, copy=None)\n",
      "     |      Scale back the data to the original representation\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape [n_samples, n_features]\n",
      "     |          The data used to scale along the features axis.\n",
      "     |      copy : bool, optional (default: None)\n",
      "     |          Copy the input X or not.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_tr : array-like, shape [n_samples, n_features]\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  partial_fit(self, X, y=None)\n",
      "     |      Online computation of mean and std on X for later scaling.\n",
      "     |      \n",
      "     |      All of X is processed as a single batch. This is intended for cases\n",
      "     |      when :meth:`fit` is not feasible due to very large number of\n",
      "     |      `n_samples` or because X is read from a continuous stream.\n",
      "     |      \n",
      "     |      The algorithm for incremental mean and std is given in Equation 1.5a,b\n",
      "     |      in Chan, Tony F., Gene H. Golub, and Randall J. LeVeque. \"Algorithms\n",
      "     |      for computing the sample variance: Analysis and recommendations.\"\n",
      "     |      The American Statistician 37.3 (1983): 242-247:\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "     |          The data used to compute the mean and standard deviation\n",
      "     |          used for later scaling along the features axis.\n",
      "     |      \n",
      "     |      y : None\n",
      "     |          Ignored.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Transformer instance.\n",
      "     |  \n",
      "     |  transform(self, X, copy=None)\n",
      "     |      Perform standardization by centering and scaling\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape [n_samples, n_features]\n",
      "     |          The data used to scale along the features axis.\n",
      "     |      copy : bool, optional (default: None)\n",
      "     |          Copy the input X or not.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "\n",
      "FUNCTIONS\n",
      "    add_dummy_feature(X, value=1.0)\n",
      "        Augment dataset with an additional dummy feature.\n",
      "        \n",
      "        This is useful for fitting an intercept term with implementations which\n",
      "        cannot otherwise fit it directly.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "            Data.\n",
      "        \n",
      "        value : float\n",
      "            Value to use for the dummy feature.\n",
      "        \n",
      "        Returns\n",
      "        -------\n",
      "        \n",
      "        X : {array, sparse matrix}, shape [n_samples, n_features + 1]\n",
      "            Same data with dummy feature added as first column.\n",
      "        \n",
      "        Examples\n",
      "        --------\n",
      "        \n",
      "        >>> from sklearn.preprocessing import add_dummy_feature\n",
      "        >>> add_dummy_feature([[0, 1], [1, 0]])\n",
      "        array([[1., 0., 1.],\n",
      "               [1., 1., 0.]])\n",
      "    \n",
      "    binarize(X, *, threshold=0.0, copy=True)\n",
      "        Boolean thresholding of array-like or scipy.sparse matrix\n",
      "        \n",
      "        Read more in the :ref:`User Guide <preprocessing_binarization>`.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "            The data to binarize, element by element.\n",
      "            scipy.sparse matrices should be in CSR or CSC format to avoid an\n",
      "            un-necessary copy.\n",
      "        \n",
      "        threshold : float, optional (0.0 by default)\n",
      "            Feature values below or equal to this are replaced by 0, above it by 1.\n",
      "            Threshold may not be less than 0 for operations on sparse matrices.\n",
      "        \n",
      "        copy : boolean, optional, default True\n",
      "            set to False to perform inplace binarization and avoid a copy\n",
      "            (if the input is already a numpy array or a scipy.sparse CSR / CSC\n",
      "            matrix and if axis is 1).\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        Binarizer: Performs binarization using the ``Transformer`` API\n",
      "            (e.g. as part of a preprocessing :class:`sklearn.pipeline.Pipeline`).\n",
      "    \n",
      "    label_binarize(y, *, classes, neg_label=0, pos_label=1, sparse_output=False)\n",
      "        Binarize labels in a one-vs-all fashion\n",
      "        \n",
      "        Several regression and binary classification algorithms are\n",
      "        available in scikit-learn. A simple way to extend these algorithms\n",
      "        to the multi-class classification case is to use the so-called\n",
      "        one-vs-all scheme.\n",
      "        \n",
      "        This function makes it possible to compute this transformation for a\n",
      "        fixed set of class labels known ahead of time.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        y : array-like\n",
      "            Sequence of integer labels or multilabel data to encode.\n",
      "        \n",
      "        classes : array-like of shape [n_classes]\n",
      "            Uniquely holds the label for each class.\n",
      "        \n",
      "        neg_label : int (default: 0)\n",
      "            Value with which negative labels must be encoded.\n",
      "        \n",
      "        pos_label : int (default: 1)\n",
      "            Value with which positive labels must be encoded.\n",
      "        \n",
      "        sparse_output : boolean (default: False),\n",
      "            Set to true if output binary array is desired in CSR sparse format\n",
      "        \n",
      "        Returns\n",
      "        -------\n",
      "        Y : numpy array or CSR matrix of shape [n_samples, n_classes]\n",
      "            Shape will be [n_samples, 1] for binary problems.\n",
      "        \n",
      "        Examples\n",
      "        --------\n",
      "        >>> from sklearn.preprocessing import label_binarize\n",
      "        >>> label_binarize([1, 6], classes=[1, 2, 4, 6])\n",
      "        array([[1, 0, 0, 0],\n",
      "               [0, 0, 0, 1]])\n",
      "        \n",
      "        The class ordering is preserved:\n",
      "        \n",
      "        >>> label_binarize([1, 6], classes=[1, 6, 4, 2])\n",
      "        array([[1, 0, 0, 0],\n",
      "               [0, 1, 0, 0]])\n",
      "        \n",
      "        Binary targets transform to a column vector\n",
      "        \n",
      "        >>> label_binarize(['yes', 'no', 'no', 'yes'], classes=['no', 'yes'])\n",
      "        array([[1],\n",
      "               [0],\n",
      "               [0],\n",
      "               [1]])\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        LabelBinarizer : class used to wrap the functionality of label_binarize and\n",
      "            allow for fitting to classes independently of the transform operation\n",
      "    \n",
      "    maxabs_scale(X, *, axis=0, copy=True)\n",
      "        Scale each feature to the [-1, 1] range without breaking the sparsity.\n",
      "        \n",
      "        This estimator scales each feature individually such\n",
      "        that the maximal absolute value of each feature in the\n",
      "        training set will be 1.0.\n",
      "        \n",
      "        This scaler can also be applied to sparse CSR or CSC matrices.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : array-like, shape (n_samples, n_features)\n",
      "            The data.\n",
      "        \n",
      "        axis : int (0 by default)\n",
      "            axis used to scale along. If 0, independently scale each feature,\n",
      "            otherwise (if 1) scale each sample.\n",
      "        \n",
      "        copy : boolean, optional, default is True\n",
      "            Set to False to perform inplace scaling and avoid a copy (if the input\n",
      "            is already a numpy array).\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        MaxAbsScaler: Performs scaling to the [-1, 1] range using the``Transformer`` API\n",
      "            (e.g. as part of a preprocessing :class:`sklearn.pipeline.Pipeline`).\n",
      "        \n",
      "        Notes\n",
      "        -----\n",
      "        NaNs are treated as missing values: disregarded to compute the statistics,\n",
      "        and maintained during the data transformation.\n",
      "        \n",
      "        For a comparison of the different scalers, transformers, and normalizers,\n",
      "        see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "        <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "    \n",
      "    minmax_scale(X, feature_range=(0, 1), *, axis=0, copy=True)\n",
      "        Transform features by scaling each feature to a given range.\n",
      "        \n",
      "        This estimator scales and translates each feature individually such\n",
      "        that it is in the given range on the training set, i.e. between\n",
      "        zero and one.\n",
      "        \n",
      "        The transformation is given by (when ``axis=0``)::\n",
      "        \n",
      "            X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))\n",
      "            X_scaled = X_std * (max - min) + min\n",
      "        \n",
      "        where min, max = feature_range.\n",
      "        \n",
      "        The transformation is calculated as (when ``axis=0``)::\n",
      "        \n",
      "           X_scaled = scale * X + min - X.min(axis=0) * scale\n",
      "           where scale = (max - min) / (X.max(axis=0) - X.min(axis=0))\n",
      "        \n",
      "        This transformation is often used as an alternative to zero mean,\n",
      "        unit variance scaling.\n",
      "        \n",
      "        Read more in the :ref:`User Guide <preprocessing_scaler>`.\n",
      "        \n",
      "        .. versionadded:: 0.17\n",
      "           *minmax_scale* function interface\n",
      "           to :class:`sklearn.preprocessing.MinMaxScaler`.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : array-like of shape (n_samples, n_features)\n",
      "            The data.\n",
      "        \n",
      "        feature_range : tuple (min, max), default=(0, 1)\n",
      "            Desired range of transformed data.\n",
      "        \n",
      "        axis : int, default=0\n",
      "            Axis used to scale along. If 0, independently scale each feature,\n",
      "            otherwise (if 1) scale each sample.\n",
      "        \n",
      "        copy : bool, default=True\n",
      "            Set to False to perform inplace scaling and avoid a copy (if the input\n",
      "            is already a numpy array).\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        MinMaxScaler: Performs scaling to a given range using the``Transformer`` API\n",
      "            (e.g. as part of a preprocessing :class:`sklearn.pipeline.Pipeline`).\n",
      "        \n",
      "        Notes\n",
      "        -----\n",
      "        For a comparison of the different scalers, transformers, and normalizers,\n",
      "        see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "        <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "    \n",
      "    normalize(X, norm='l2', *, axis=1, copy=True, return_norm=False)\n",
      "        Scale input vectors individually to unit norm (vector length).\n",
      "        \n",
      "        Read more in the :ref:`User Guide <preprocessing_normalization>`.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "            The data to normalize, element by element.\n",
      "            scipy.sparse matrices should be in CSR format to avoid an\n",
      "            un-necessary copy.\n",
      "        \n",
      "        norm : 'l1', 'l2', or 'max', optional ('l2' by default)\n",
      "            The norm to use to normalize each non zero sample (or each non-zero\n",
      "            feature if axis is 0).\n",
      "        \n",
      "        axis : 0 or 1, optional (1 by default)\n",
      "            axis used to normalize the data along. If 1, independently normalize\n",
      "            each sample, otherwise (if 0) normalize each feature.\n",
      "        \n",
      "        copy : boolean, optional, default True\n",
      "            set to False to perform inplace row normalization and avoid a\n",
      "            copy (if the input is already a numpy array or a scipy.sparse\n",
      "            CSR matrix and if axis is 1).\n",
      "        \n",
      "        return_norm : boolean, default False\n",
      "            whether to return the computed norms\n",
      "        \n",
      "        Returns\n",
      "        -------\n",
      "        X : {array-like, sparse matrix}, shape [n_samples, n_features]\n",
      "            Normalized input X.\n",
      "        \n",
      "        norms : array, shape [n_samples] if axis=1 else [n_features]\n",
      "            An array of norms along given axis for X.\n",
      "            When X is sparse, a NotImplementedError will be raised\n",
      "            for norm 'l1' or 'l2'.\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        Normalizer: Performs normalization using the ``Transformer`` API\n",
      "            (e.g. as part of a preprocessing :class:`sklearn.pipeline.Pipeline`).\n",
      "        \n",
      "        Notes\n",
      "        -----\n",
      "        For a comparison of the different scalers, transformers, and normalizers,\n",
      "        see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "        <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "    \n",
      "    power_transform(X, method='yeo-johnson', *, standardize=True, copy=True)\n",
      "        Power transforms are a family of parametric, monotonic transformations\n",
      "        that are applied to make data more Gaussian-like. This is useful for\n",
      "        modeling issues related to heteroscedasticity (non-constant variance),\n",
      "        or other situations where normality is desired.\n",
      "        \n",
      "        Currently, power_transform supports the Box-Cox transform and the\n",
      "        Yeo-Johnson transform. The optimal parameter for stabilizing variance and\n",
      "        minimizing skewness is estimated through maximum likelihood.\n",
      "        \n",
      "        Box-Cox requires input data to be strictly positive, while Yeo-Johnson\n",
      "        supports both positive or negative data.\n",
      "        \n",
      "        By default, zero-mean, unit-variance normalization is applied to the\n",
      "        transformed data.\n",
      "        \n",
      "        Read more in the :ref:`User Guide <preprocessing_transformer>`.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : array-like, shape (n_samples, n_features)\n",
      "            The data to be transformed using a power transformation.\n",
      "        \n",
      "        method : {'yeo-johnson', 'box-cox'}, default='yeo-johnson'\n",
      "            The power transform method. Available methods are:\n",
      "        \n",
      "            - 'yeo-johnson' [1]_, works with positive and negative values\n",
      "            - 'box-cox' [2]_, only works with strictly positive values\n",
      "        \n",
      "            .. versionchanged:: 0.23\n",
      "                The default value of the `method` parameter changed from\n",
      "                'box-cox' to 'yeo-johnson' in 0.23.\n",
      "        \n",
      "        standardize : boolean, default=True\n",
      "            Set to True to apply zero-mean, unit-variance normalization to the\n",
      "            transformed output.\n",
      "        \n",
      "        copy : boolean, optional, default=True\n",
      "            Set to False to perform inplace computation during transformation.\n",
      "        \n",
      "        Returns\n",
      "        -------\n",
      "        X_trans : array-like, shape (n_samples, n_features)\n",
      "            The transformed data.\n",
      "        \n",
      "        Examples\n",
      "        --------\n",
      "        >>> import numpy as np\n",
      "        >>> from sklearn.preprocessing import power_transform\n",
      "        >>> data = [[1, 2], [3, 2], [4, 5]]\n",
      "        >>> print(power_transform(data, method='box-cox'))\n",
      "        [[-1.332... -0.707...]\n",
      "         [ 0.256... -0.707...]\n",
      "         [ 1.076...  1.414...]]\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        PowerTransformer : Equivalent transformation with the\n",
      "            ``Transformer`` API (e.g. as part of a preprocessing\n",
      "            :class:`sklearn.pipeline.Pipeline`).\n",
      "        \n",
      "        quantile_transform : Maps data to a standard normal distribution with\n",
      "            the parameter `output_distribution='normal'`.\n",
      "        \n",
      "        Notes\n",
      "        -----\n",
      "        NaNs are treated as missing values: disregarded in ``fit``, and maintained\n",
      "        in ``transform``.\n",
      "        \n",
      "        For a comparison of the different scalers, transformers, and normalizers,\n",
      "        see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "        <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "        \n",
      "        References\n",
      "        ----------\n",
      "        \n",
      "        .. [1] I.K. Yeo and R.A. Johnson, \"A new family of power transformations to\n",
      "               improve normality or symmetry.\" Biometrika, 87(4), pp.954-959,\n",
      "               (2000).\n",
      "        \n",
      "        .. [2] G.E.P. Box and D.R. Cox, \"An Analysis of Transformations\", Journal\n",
      "               of the Royal Statistical Society B, 26, 211-252 (1964).\n",
      "    \n",
      "    quantile_transform(X, *, axis=0, n_quantiles=1000, output_distribution='uniform', ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=True)\n",
      "        Transform features using quantiles information.\n",
      "        \n",
      "        This method transforms the features to follow a uniform or a normal\n",
      "        distribution. Therefore, for a given feature, this transformation tends\n",
      "        to spread out the most frequent values. It also reduces the impact of\n",
      "        (marginal) outliers: this is therefore a robust preprocessing scheme.\n",
      "        \n",
      "        The transformation is applied on each feature independently. First an\n",
      "        estimate of the cumulative distribution function of a feature is\n",
      "        used to map the original values to a uniform distribution. The obtained\n",
      "        values are then mapped to the desired output distribution using the\n",
      "        associated quantile function. Features values of new/unseen data that fall\n",
      "        below or above the fitted range will be mapped to the bounds of the output\n",
      "        distribution. Note that this transform is non-linear. It may distort linear\n",
      "        correlations between variables measured at the same scale but renders\n",
      "        variables measured at different scales more directly comparable.\n",
      "        \n",
      "        Read more in the :ref:`User Guide <preprocessing_transformer>`.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : array-like, sparse matrix\n",
      "            The data to transform.\n",
      "        \n",
      "        axis : int, (default=0)\n",
      "            Axis used to compute the means and standard deviations along. If 0,\n",
      "            transform each feature, otherwise (if 1) transform each sample.\n",
      "        \n",
      "        n_quantiles : int, optional (default=1000 or n_samples)\n",
      "            Number of quantiles to be computed. It corresponds to the number\n",
      "            of landmarks used to discretize the cumulative distribution function.\n",
      "            If n_quantiles is larger than the number of samples, n_quantiles is set\n",
      "            to the number of samples as a larger number of quantiles does not give\n",
      "            a better approximation of the cumulative distribution function\n",
      "            estimator.\n",
      "        \n",
      "        output_distribution : str, optional (default='uniform')\n",
      "            Marginal distribution for the transformed data. The choices are\n",
      "            'uniform' (default) or 'normal'.\n",
      "        \n",
      "        ignore_implicit_zeros : bool, optional (default=False)\n",
      "            Only applies to sparse matrices. If True, the sparse entries of the\n",
      "            matrix are discarded to compute the quantile statistics. If False,\n",
      "            these entries are treated as zeros.\n",
      "        \n",
      "        subsample : int, optional (default=1e5)\n",
      "            Maximum number of samples used to estimate the quantiles for\n",
      "            computational efficiency. Note that the subsampling procedure may\n",
      "            differ for value-identical sparse and dense matrices.\n",
      "        \n",
      "        random_state : int, RandomState instance or None, optional (default=None)\n",
      "            Determines random number generation for subsampling and smoothing\n",
      "            noise.\n",
      "            Please see ``subsample`` for more details.\n",
      "            Pass an int for reproducible results across multiple function calls.\n",
      "            See :term:`Glossary <random_state>`\n",
      "        \n",
      "        copy : boolean, optional, (default=True)\n",
      "            Set to False to perform inplace transformation and avoid a copy (if the\n",
      "            input is already a numpy array). If True, a copy of `X` is transformed,\n",
      "            leaving the original `X` unchanged\n",
      "        \n",
      "            ..versionchanged:: 0.23\n",
      "                The default value of `copy` changed from False to True in 0.23.\n",
      "        \n",
      "        Returns\n",
      "        -------\n",
      "        Xt : ndarray or sparse matrix, shape (n_samples, n_features)\n",
      "            The transformed data.\n",
      "        \n",
      "        Examples\n",
      "        --------\n",
      "        >>> import numpy as np\n",
      "        >>> from sklearn.preprocessing import quantile_transform\n",
      "        >>> rng = np.random.RandomState(0)\n",
      "        >>> X = np.sort(rng.normal(loc=0.5, scale=0.25, size=(25, 1)), axis=0)\n",
      "        >>> quantile_transform(X, n_quantiles=10, random_state=0, copy=True)\n",
      "        array([...])\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        QuantileTransformer : Performs quantile-based scaling using the\n",
      "            ``Transformer`` API (e.g. as part of a preprocessing\n",
      "            :class:`sklearn.pipeline.Pipeline`).\n",
      "        power_transform : Maps data to a normal distribution using a\n",
      "            power transformation.\n",
      "        scale : Performs standardization that is faster, but less robust\n",
      "            to outliers.\n",
      "        robust_scale : Performs robust standardization that removes the influence\n",
      "            of outliers but does not put outliers and inliers on the same scale.\n",
      "        \n",
      "        Notes\n",
      "        -----\n",
      "        NaNs are treated as missing values: disregarded in fit, and maintained in\n",
      "        transform.\n",
      "        \n",
      "        For a comparison of the different scalers, transformers, and normalizers,\n",
      "        see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "        <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "    \n",
      "    robust_scale(X, *, axis=0, with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)\n",
      "        Standardize a dataset along any axis\n",
      "        \n",
      "        Center to the median and component wise scale\n",
      "        according to the interquartile range.\n",
      "        \n",
      "        Read more in the :ref:`User Guide <preprocessing_scaler>`.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : array-like\n",
      "            The data to center and scale.\n",
      "        \n",
      "        axis : int (0 by default)\n",
      "            axis used to compute the medians and IQR along. If 0,\n",
      "            independently scale each feature, otherwise (if 1) scale\n",
      "            each sample.\n",
      "        \n",
      "        with_centering : boolean, True by default\n",
      "            If True, center the data before scaling.\n",
      "        \n",
      "        with_scaling : boolean, True by default\n",
      "            If True, scale the data to unit variance (or equivalently,\n",
      "            unit standard deviation).\n",
      "        \n",
      "        quantile_range : tuple (q_min, q_max), 0.0 < q_min < q_max < 100.0\n",
      "            Default: (25.0, 75.0) = (1st quantile, 3rd quantile) = IQR\n",
      "            Quantile range used to calculate ``scale_``.\n",
      "        \n",
      "            .. versionadded:: 0.18\n",
      "        \n",
      "        copy : boolean, optional, default is True\n",
      "            set to False to perform inplace row normalization and avoid a\n",
      "            copy (if the input is already a numpy array or a scipy.sparse\n",
      "            CSR matrix and if axis is 1).\n",
      "        \n",
      "        Notes\n",
      "        -----\n",
      "        This implementation will refuse to center scipy.sparse matrices\n",
      "        since it would make them non-sparse and would potentially crash the\n",
      "        program with memory exhaustion problems.\n",
      "        \n",
      "        Instead the caller is expected to either set explicitly\n",
      "        `with_centering=False` (in that case, only variance scaling will be\n",
      "        performed on the features of the CSR matrix) or to call `X.toarray()`\n",
      "        if he/she expects the materialized dense array to fit in memory.\n",
      "        \n",
      "        To avoid memory copy the caller should pass a CSR matrix.\n",
      "        \n",
      "        For a comparison of the different scalers, transformers, and normalizers,\n",
      "        see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "        <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        RobustScaler: Performs centering and scaling using the ``Transformer`` API\n",
      "            (e.g. as part of a preprocessing :class:`sklearn.pipeline.Pipeline`).\n",
      "    \n",
      "    scale(X, *, axis=0, with_mean=True, with_std=True, copy=True)\n",
      "        Standardize a dataset along any axis\n",
      "        \n",
      "        Center to the mean and component wise scale to unit variance.\n",
      "        \n",
      "        Read more in the :ref:`User Guide <preprocessing_scaler>`.\n",
      "        \n",
      "        Parameters\n",
      "        ----------\n",
      "        X : {array-like, sparse matrix}\n",
      "            The data to center and scale.\n",
      "        \n",
      "        axis : int (0 by default)\n",
      "            axis used to compute the means and standard deviations along. If 0,\n",
      "            independently standardize each feature, otherwise (if 1) standardize\n",
      "            each sample.\n",
      "        \n",
      "        with_mean : boolean, True by default\n",
      "            If True, center the data before scaling.\n",
      "        \n",
      "        with_std : boolean, True by default\n",
      "            If True, scale the data to unit variance (or equivalently,\n",
      "            unit standard deviation).\n",
      "        \n",
      "        copy : boolean, optional, default True\n",
      "            set to False to perform inplace row normalization and avoid a\n",
      "            copy (if the input is already a numpy array or a scipy.sparse\n",
      "            CSC matrix and if axis is 1).\n",
      "        \n",
      "        Notes\n",
      "        -----\n",
      "        This implementation will refuse to center scipy.sparse matrices\n",
      "        since it would make them non-sparse and would potentially crash the\n",
      "        program with memory exhaustion problems.\n",
      "        \n",
      "        Instead the caller is expected to either set explicitly\n",
      "        `with_mean=False` (in that case, only variance scaling will be\n",
      "        performed on the features of the CSC matrix) or to call `X.toarray()`\n",
      "        if he/she expects the materialized dense array to fit in memory.\n",
      "        \n",
      "        To avoid memory copy the caller should pass a CSC matrix.\n",
      "        \n",
      "        NaNs are treated as missing values: disregarded to compute the statistics,\n",
      "        and maintained during the data transformation.\n",
      "        \n",
      "        We use a biased estimator for the standard deviation, equivalent to\n",
      "        `numpy.std(x, ddof=0)`. Note that the choice of `ddof` is unlikely to\n",
      "        affect model performance.\n",
      "        \n",
      "        For a comparison of the different scalers, transformers, and normalizers,\n",
      "        see :ref:`examples/preprocessing/plot_all_scaling.py\n",
      "        <sphx_glr_auto_examples_preprocessing_plot_all_scaling.py>`.\n",
      "        \n",
      "        See also\n",
      "        --------\n",
      "        StandardScaler: Performs scaling to unit variance using the``Transformer`` API\n",
      "            (e.g. as part of a preprocessing :class:`sklearn.pipeline.Pipeline`).\n",
      "\n",
      "DATA\n",
      "    __all__ = ['Binarizer', 'FunctionTransformer', 'KBinsDiscretizer', 'Ke...\n",
      "\n",
      "FILE\n",
      "    c:\\programdata\\anaconda3\\envs\\py36_b\\lib\\site-packages\\sklearn\\preprocessing\\__init__.py\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(sklearn.preprocessing)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "---\n",
    "# category_encoders  \n",
    "类别处理\n",
    "  \n",
    "https://blog.csdn.net/weixin_42422585/article/details/83542722    \n",
    "https://pypi.org/project/category-encoders/1.2.6/  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Platform : win32 [win32/linux]\n",
      "Systerm  : 3.6.10 (default, Mar  5 2020, 10:17:47) [MSC v.1900 64 bit (AMD64)] \n",
      "pandas Version: 1.0.4\n",
      "category_encoders Version: 2.2.2\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "import pandas as pd\n",
    "import category_encoders as ce\n",
    "\n",
    "print('Platform : {} [win32/linux]'.format(sys.platform))  # 当前平台信息 \n",
    "print('Systerm  : {} '.format(sys.version))\n",
    "print('pandas Version: {}'.format(pd.__version__))\n",
    "print('category_encoders Version: {}'.format(ce.__version__))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "### category_encoders       [类别变量处理](https://blog.csdn.net/weixin_42422585/article/details/83542722   \"类别变量处理\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>RATING</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>G</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>B</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>G</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>R</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>R</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>G</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID RATING\n",
       "0   1      G\n",
       "1   2      B\n",
       "2   3      G\n",
       "3   4      R\n",
       "4   5      R\n",
       "5   6      G"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 准备数据\n",
    "df = pd.DataFrame({'ID':[1,2,3,4,5,6],\n",
    "                   'RATING':['G','B','G','R','R','G']})\n",
    "\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "###  BinaryEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "BinaryEncoder\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>RATING</th>\n",
       "      <th>RATING_0</th>\n",
       "      <th>RATING_1</th>\n",
       "      <th>RATING_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>B</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>R</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>R</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID RATING  RATING_0  RATING_1  RATING_2\n",
       "0   1      G         0         0         1\n",
       "1   2      B         0         1         0\n",
       "2   3      G         0         0         1\n",
       "3   4      R         0         1         1\n",
       "4   5      R         0         1         1\n",
       "5   6      G         0         0         1"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# BinaryEncoder\n",
    "encoder = ce.BinaryEncoder(cols=['RATING']).fit(df)\n",
    "# 转换数据\n",
    "numeric_dataset = encoder.transform(df)\n",
    "\n",
    "print('BinaryEncoder')\n",
    "pd.merge(df,  numeric_dataset)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "### BaseNEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "BaseNEncoder\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>RATING</th>\n",
       "      <th>RATING_0</th>\n",
       "      <th>RATING_1</th>\n",
       "      <th>RATING_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>B</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>R</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>R</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID RATING  RATING_0  RATING_1  RATING_2\n",
       "0   1      G         0         0         1\n",
       "1   2      B         0         1         0\n",
       "2   3      G         0         0         1\n",
       "3   4      R         0         1         1\n",
       "4   5      R         0         1         1\n",
       "5   6      G         0         0         1"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# BaseNEncoder\n",
    "encoder = ce.BaseNEncoder(cols=['RATING']).fit(df)\n",
    "# 转换数据\n",
    "numeric_dataset = encoder.transform(df)\n",
    "\n",
    "print('BaseNEncoder')\n",
    "pd.merge(df,  numeric_dataset)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "### HashingEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "HashingEncoder\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>RATING</th>\n",
       "      <th>col_0</th>\n",
       "      <th>col_1</th>\n",
       "      <th>col_2</th>\n",
       "      <th>col_3</th>\n",
       "      <th>col_4</th>\n",
       "      <th>col_5</th>\n",
       "      <th>col_6</th>\n",
       "      <th>col_7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>B</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>R</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>R</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>G</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID RATING  col_0  col_1  col_2  col_3  col_4  col_5  col_6  col_7\n",
       "0   1      G      0      0      0      0      0      0      0      1\n",
       "1   2      B      0      1      0      0      0      0      0      0\n",
       "2   3      G      0      0      0      0      0      0      0      1\n",
       "3   4      R      0      0      0      0      0      0      1      0\n",
       "4   5      R      0      0      0      0      0      0      1      0\n",
       "5   6      G      0      0      0      0      0      0      0      1"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# HashingEncoder\n",
    "encoder = ce.HashingEncoder(cols=['RATING']).fit(df)\n",
    "# 转换数据\n",
    "numeric_dataset = encoder.transform(df)\n",
    "\n",
    "print('HashingEncoder')\n",
    "pd.merge(df,  numeric_dataset)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "### OrdinalEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OrdinalEncoder\n",
      "G      1\n",
      "B      2\n",
      "R      3\n",
      "NaN   -2\n",
      "dtype: int64\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>RATING</th>\n",
       "      <th>RatingEncoder</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>G</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>B</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>G</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>R</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>R</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>G</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID RATING  RatingEncoder\n",
       "0   1      G              1\n",
       "1   2      B              2\n",
       "2   3      G              1\n",
       "3   4      R              3\n",
       "4   5      R              3\n",
       "5   6      G              1"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# OrdinalEncoder\n",
    "encoder = ce.OrdinalEncoder(cols=['RATING']).fit(df)\n",
    "# 转换数据\n",
    "numeric_dataset = encoder.transform(df)\n",
    "\n",
    "print('OrdinalEncoder')\n",
    "print(encoder.mapping[0]['mapping'])\n",
    "numeric_dataset.columns = ['ID', 'RatingEncoder']\n",
    "pd.merge(df,  numeric_dataset)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "### OneHotEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OrdinalEncoder\n",
      "    RATING_1  RATING_2  RATING_3\n",
      " 1         1         0         0\n",
      " 2         0         1         0\n",
      " 3         0         0         1\n",
      "-1         0         0         0\n",
      "-2         0         0         0\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>RATING</th>\n",
       "      <th>RATING_1</th>\n",
       "      <th>RATING_2</th>\n",
       "      <th>RATING_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>G</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>B</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>G</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>R</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>R</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>G</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID RATING  RATING_1  RATING_2  RATING_3\n",
       "0   1      G         1         0         0\n",
       "1   2      B         0         1         0\n",
       "2   3      G         1         0         0\n",
       "3   4      R         0         0         1\n",
       "4   5      R         0         0         1\n",
       "5   6      G         1         0         0"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# OneHotEncoder\n",
    "encoder = ce.OneHotEncoder(cols=['RATING']).fit(df)\n",
    "# 转换数据\n",
    "numeric_dataset = encoder.transform(df)\n",
    "\n",
    "print('OrdinalEncoder')\n",
    "print(encoder.mapping[0]['mapping'])\n",
    "# numeric_dataset.columns = ['ID', 'RatingEncoder']\n",
    "pd.merge(df,  numeric_dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on package category_encoders:\n",
      "\n",
      "NAME\n",
      "    category_encoders\n",
      "\n",
      "DESCRIPTION\n",
      "    .. module:: category_encoders\n",
      "      :synopsis:\n",
      "      :platform:\n",
      "\n",
      "PACKAGE CONTENTS\n",
      "    backward_difference\n",
      "    basen\n",
      "    binary\n",
      "    cat_boost\n",
      "    count\n",
      "    glmm\n",
      "    hashing\n",
      "    helmert\n",
      "    james_stein\n",
      "    leave_one_out\n",
      "    m_estimate\n",
      "    one_hot\n",
      "    ordinal\n",
      "    polynomial\n",
      "    sum_coding\n",
      "    target_encoder\n",
      "    utils\n",
      "    woe\n",
      "    wrapper\n",
      "\n",
      "CLASSES\n",
      "    category_encoders.utils.TransformerWithTargetMixin(builtins.object)\n",
      "        category_encoders.cat_boost.CatBoostEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.glmm.GLMMEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.james_stein.JamesSteinEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.leave_one_out.LeaveOneOutEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.m_estimate.MEstimateEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.target_encoder.TargetEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.woe.WOEEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "    sklearn.base.BaseEstimator(builtins.object)\n",
      "        category_encoders.backward_difference.BackwardDifferenceEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.basen.BaseNEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.binary.BinaryEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.cat_boost.CatBoostEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.glmm.GLMMEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.hashing.HashingEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.helmert.HelmertEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.james_stein.JamesSteinEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.leave_one_out.LeaveOneOutEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.m_estimate.MEstimateEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.one_hot.OneHotEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.ordinal.OrdinalEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.polynomial.PolynomialEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.sum_coding.SumEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.target_encoder.TargetEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "        category_encoders.woe.WOEEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "    sklearn.base.TransformerMixin(builtins.object)\n",
      "        category_encoders.backward_difference.BackwardDifferenceEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.basen.BaseNEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.binary.BinaryEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.hashing.HashingEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.helmert.HelmertEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.one_hot.OneHotEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.ordinal.OrdinalEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.polynomial.PolynomialEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "        category_encoders.sum_coding.SumEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "    \n",
      "    class BackwardDifferenceEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  Backward difference contrast coding for encoding categorical variables.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has unknown categories.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has nan values.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = BackwardDifferenceEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 21 columns):\n",
      "     |  intercept    506 non-null int64\n",
      "     |  CRIM         506 non-null float64\n",
      "     |  ZN           506 non-null float64\n",
      "     |  INDUS        506 non-null float64\n",
      "     |  CHAS_0       506 non-null float64\n",
      "     |  NOX          506 non-null float64\n",
      "     |  RM           506 non-null float64\n",
      "     |  AGE          506 non-null float64\n",
      "     |  DIS          506 non-null float64\n",
      "     |  RAD_0        506 non-null float64\n",
      "     |  RAD_1        506 non-null float64\n",
      "     |  RAD_2        506 non-null float64\n",
      "     |  RAD_3        506 non-null float64\n",
      "     |  RAD_4        506 non-null float64\n",
      "     |  RAD_5        506 non-null float64\n",
      "     |  RAD_6        506 non-null float64\n",
      "     |  RAD_7        506 non-null float64\n",
      "     |  TAX          506 non-null float64\n",
      "     |  PTRATIO      506 non-null float64\n",
      "     |  B            506 non-null float64\n",
      "     |  LSTAT        506 non-null float64\n",
      "     |  dtypes: float64(20), int64(1)\n",
      "     |  memory usage: 83.1 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Contrast Coding Systems for Categorical Variables, from\n",
      "     |  https://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/\n",
      "     |  \n",
      "     |  .. [2] Gregory Carey (2003). Coding Categorical Variables, from\n",
      "     |  http://psych.colorado.edu/~carey/Courses/PSYC5741/handouts/Coding%20Categorical%20Variables%202006-03-03.pdf\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      BackwardDifferenceEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, mapping=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fits an ordinal encoder to produce a consistent mapping across applications and optionally finds\n",
      "     |      generally invariant columns to drop consistently.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Static methods defined here:\n",
      "     |  \n",
      "     |  backward_difference_coding(X_in, mapping)\n",
      "     |  \n",
      "     |  fit_backward_difference_coding(col, values, handle_missing, handle_unknown)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class BaseNEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  Base-N encoder encodes the categories into arrays of their base-N representation.  A base of 1 is equivalent to\n",
      "     |  one-hot encoding (not really base-1, but useful), a base of 2 is equivalent to binary encoding. N=number of actual\n",
      "     |  categories is equivalent to vanilla ordinal encoding.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  base: int\n",
      "     |      when the downstream model copes well with nonlinearities (like decision tree), use higher base.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has unknown categories.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has nan values.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = BaseNEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 18 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS_0     506 non-null int64\n",
      "     |  CHAS_1     506 non-null int64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD_0      506 non-null int64\n",
      "     |  RAD_1      506 non-null int64\n",
      "     |  RAD_2      506 non-null int64\n",
      "     |  RAD_3      506 non-null int64\n",
      "     |  RAD_4      506 non-null int64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(11), int64(7)\n",
      "     |  memory usage: 71.3 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      BaseNEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, mapping=None, drop_invariant=False, return_df=True, base=2, handle_unknown='value', handle_missing='value')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  basen_encode(self, X_in, cols=None)\n",
      "     |      Basen encoding encodes the integers as basen code with one column per digit.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X_in: DataFrame\n",
      "     |      cols: list-like, default None\n",
      "     |          Column names in the DataFrame to be encoded\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      dummies : DataFrame\n",
      "     |  \n",
      "     |  basen_to_integer(self, X, cols, base)\n",
      "     |      Convert basen code as integers.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : DataFrame\n",
      "     |          encoded data\n",
      "     |      cols : list-like\n",
      "     |          Column names in the DataFrame that be encoded\n",
      "     |      base : int\n",
      "     |          The base of transform\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      numerical: DataFrame\n",
      "     |  \n",
      "     |  calc_required_digits(self, values)\n",
      "     |  \n",
      "     |  col_transform(self, col, digits)\n",
      "     |      The lambda body to transform the column values\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  fit_base_n_encoding(self, X)\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  inverse_transform(self, X_in)\n",
      "     |      Perform the inverse transformation to encoded data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X_in : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      p: array, the same size of X_in\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Static methods defined here:\n",
      "     |  \n",
      "     |  number_to_base(n, b, limit)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class BinaryEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  Binary encoding for categorical variables, similar to onehot, but stores categories as binary bitstrings.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has unknown categories.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has nan values.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = BinaryEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 18 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS_0     506 non-null int64\n",
      "     |  CHAS_1     506 non-null int64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD_0      506 non-null int64\n",
      "     |  RAD_1      506 non-null int64\n",
      "     |  RAD_2      506 non-null int64\n",
      "     |  RAD_3      506 non-null int64\n",
      "     |  RAD_4      506 non-null int64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(11), int64(7)\n",
      "     |  memory usage: 71.3 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      BinaryEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, mapping=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  inverse_transform(self, X_in)\n",
      "     |      Perform the inverse transformation to encoded data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X_in : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      p: array, the same size of X_in\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class CatBoostEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "     |  CatBoost coding for categorical features.\n",
      "     |  \n",
      "     |  This is very similar to leave-one-out encoding, but calculates the\n",
      "     |  values \"on-the-fly\". Consequently, the values naturally vary\n",
      "     |  during the training phase and it is not necessary to add random noise.\n",
      "     |  \n",
      "     |  Beware, the training data have to be randomly permutated. E.g.:\n",
      "     |  \n",
      "     |      # Random permutation\n",
      "     |      perm = np.random.permutation(len(X))\n",
      "     |      X = X.iloc[perm].reset_index(drop=True)\n",
      "     |      y = y.iloc[perm].reset_index(drop=True)\n",
      "     |  \n",
      "     |  This is necessary because some data sets are sorted based on the target\n",
      "     |  value and this coder encodes the features on-the-fly in a single pass.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan'  and 'value', defaults to 'value', which returns the target mean.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan' and 'value', defaults to 'value', which returns the target mean.\n",
      "     |  sigma: float\n",
      "     |      adds normal (Gaussian) distribution noise into training data in order to decrease overfitting (testing data are untouched).\n",
      "     |      sigma gives the standard deviation (spread or \"width\") of the normal distribution.\n",
      "     |  a: float\n",
      "     |      additive smoothing (it is the same variable as \"m\" in m-probability estimate). By default set to 1.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = CatBoostEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 13 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS       506 non-null float64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD        506 non-null float64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(13)\n",
      "     |  memory usage: 51.5 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Transforming categorical features to numerical features, from\n",
      "     |  https://tech.yandex.com/catboost/doc/dg/concepts/algorithm-main-stages_cat-to-numberic-docpage/\n",
      "     |  \n",
      "     |  .. [2] CatBoost: unbiased boosting with categorical features, from\n",
      "     |  https://arxiv.org/abs/1706.09516\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      CatBoostEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      category_encoders.utils.TransformerWithTargetMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value', random_state=None, sigma=None, a=1)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, y=None, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      y : array-like, shape = [n_samples] when transform by leave one out\n",
      "     |          None, when transform without target information (such as transform test set)\n",
      "     |      \n",
      "     |      \n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from category_encoders.utils.TransformerWithTargetMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Encoders that utilize the target must make sure that the training data are transformed with:\n",
      "     |           transform(X, y)\n",
      "     |      and not with:\n",
      "     |          transform(X)\n",
      "    \n",
      "    class GLMMEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "     |  Generalized linear mixed model.\n",
      "     |  \n",
      "     |  This is a supervised encoder similar to TargetEncoder or MEstimateEncoder, but there are some advantages:\n",
      "     |  1) Solid statistical theory behind the technique. Mixed effects models are a mature branch of statistics.\n",
      "     |  2) No hyper-parameters to tune. The amount of shrinkage is automatically determined through the estimation process.\n",
      "     |  In short, the less observations a category has and/or the more the outcome varies for a category\n",
      "     |  then the higher the regularization towards \"the prior\" or \"grand mean\".\n",
      "     |  3) The technique is applicable for both continuous and binomial targets. If the target is continuous,\n",
      "     |  the encoder returns regularized difference of the observation's category from the global mean.\n",
      "     |  If the target is binomial, the encoder returns regularized log odds per category.\n",
      "     |  \n",
      "     |  In comparison to JamesSteinEstimator, this encoder utilizes generalized linear mixed models from statsmodels library.\n",
      "     |  \n",
      "     |  Note: This is an alpha implementation. The API of the method may change in the future.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop encoded columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_missing: str\n",
      "     |      options are 'return_nan', 'error' and 'value', defaults to 'value', which returns 0.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'return_nan', 'error' and 'value', defaults to 'value', which returns 0.\n",
      "     |  randomized: bool,\n",
      "     |      adds normal (Gaussian) distribution noise into training data in order to decrease overfitting (testing data are untouched).\n",
      "     |  sigma: float\n",
      "     |      standard deviation (spread or \"width\") of the normal distribution.\n",
      "     |  binomial_target: bool\n",
      "     |      if True, the target must be binomial with values {0, 1} and Binomial mixed model is used.\n",
      "     |      If False, the target must be continuous and Linear mixed model is used.\n",
      "     |      If None (the default), a heuristic is applied to estimate the target type.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target > 22.5\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = GLMMEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 13 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS       506 non-null float64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD        506 non-null float64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(13)\n",
      "     |  memory usage: 51.5 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Data Analysis Using Regression and Multilevel/Hierarchical Models, page 253, from\n",
      "     |  https://faculty.psau.edu.sa/filedownload/doc-12-pdf-a1997d0d31f84d13c1cdc44ac39a8f2c-original.pdf\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      GLMMEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      category_encoders.utils.TransformerWithTargetMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value', random_state=None, randomized=False, sigma=0.05, binomial_target=None)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y, **kwargs)\n",
      "     |      Fit encoder according to X and binary y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Binary target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, y=None, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      When the data are used for model training, it is important to also pass the target in order to apply leave one out.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      y : array-like, shape = [n_samples] when transform by leave one out\n",
      "     |          None, when transform without target information (such as transform test set)\n",
      "     |      \n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from category_encoders.utils.TransformerWithTargetMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Encoders that utilize the target must make sure that the training data are transformed with:\n",
      "     |           transform(X, y)\n",
      "     |      and not with:\n",
      "     |          transform(X)\n",
      "    \n",
      "    class HashingEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  A multivariate hashing implementation with configurable dimensionality/precision.\n",
      "     |  \n",
      "     |  The advantage of this encoder is that it does not maintain a dictionary of observed categories.\n",
      "     |  Consequently, the encoder does not grow in size and accepts new values during data scoring\n",
      "     |  by design.\n",
      "     |  \n",
      "     |  It's important to read about how max_process & max_sample work\n",
      "     |  before setting them manually, inappropriate setting slows down encoding.\n",
      "     |  \n",
      "     |  Default value of 'max_process' is 1 on Windows because multiprocessing might cause issues, see in :\n",
      "     |  https://github.com/scikit-learn-contrib/categorical-encoding/issues/215\n",
      "     |  https://docs.python.org/2/library/multiprocessing.html?highlight=process#windows\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  hash_method: str\n",
      "     |      which hashing method to use. Any method from hashlib works.\n",
      "     |  max_process: int\n",
      "     |      how many processes to use in transform(). Limited in range(1, 64).\n",
      "     |      By default, it uses half of the logical CPUs.\n",
      "     |      For example, 4C4T makes max_process=2, 4C8T makes max_process=4.\n",
      "     |      Set it larger if you have a strong CPU.\n",
      "     |      It is not recommended to set it larger than is the count of the\n",
      "     |      logical CPUs as it will actually slow down the encoding.\n",
      "     |  max_sample: int\n",
      "     |      how many samples to encode by each process at a time.\n",
      "     |      This setting is useful on low memory machines.\n",
      "     |      By default, max_sample=(all samples num)/(max_process).\n",
      "     |      For example, 4C8T CPU with 100,000 samples makes max_sample=25,000,\n",
      "     |      6C12T CPU with 100,000 samples makes max_sample=16,666.\n",
      "     |      It is not recommended to set it larger than the default value.\n",
      "     |  n_components: int\n",
      "     |      how many bits to use to represent the feature. By default we use 8 bits.\n",
      "     |      For high-cardinality features, consider using up-to 32 bits.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders.hashing import HashingEncoder\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> he = HashingEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> data = he.transform(X)\n",
      "     |  >>> print(data.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 19 columns):\n",
      "     |  col_0      506 non-null int64\n",
      "     |  col_1      506 non-null int64\n",
      "     |  col_2      506 non-null int64\n",
      "     |  col_3      506 non-null int64\n",
      "     |  col_4      506 non-null int64\n",
      "     |  col_5      506 non-null int64\n",
      "     |  col_6      506 non-null int64\n",
      "     |  col_7      506 non-null int64\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(11), int64(8)\n",
      "     |  memory usage: 75.2 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  .. [1] Feature Hashing for Large Scale Multitask Learning, from\n",
      "     |  https://alex.smola.org/papers/2009/Weinbergeretal09.pdf\n",
      "     |  .. [2] Don't be tricked by the Hashing Trick, from\n",
      "     |  https://booking.ai/dont-be-tricked-by-the-hashing-trick-192a6aae3087\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      HashingEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, max_process=0, max_sample=0, verbose=0, n_components=8, cols=None, drop_invariant=False, return_df=True, hash_method='md5')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Call _transform() if you want to use single CPU with all samples\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Static methods defined here:\n",
      "     |  \n",
      "     |  hashing_trick(X_in, hashing_method='md5', N=2, cols=None, make_copy=False)\n",
      "     |      A basic hashing implementation with configurable dimensionality/precision\n",
      "     |      \n",
      "     |      Performs the hashing trick on a pandas dataframe, `X`, using the hashing method from hashlib\n",
      "     |      identified by `hashing_method`.  The number of output dimensions (`N`), and columns to hash (`cols`) are\n",
      "     |      also configurable.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X_in: pandas dataframe\n",
      "     |          description text\n",
      "     |      hashing_method: string, optional\n",
      "     |          description text\n",
      "     |      N: int, optional\n",
      "     |          description text\n",
      "     |      cols: list, optional\n",
      "     |          description text\n",
      "     |      make_copy: bool, optional\n",
      "     |          description text\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      out : dataframe\n",
      "     |          A hashing encoded dataframe.\n",
      "     |      \n",
      "     |      References\n",
      "     |      ----------\n",
      "     |      Cite the relevant literature, e.g. [1]_.  You may also cite these\n",
      "     |      references in the notes section above.\n",
      "     |      .. [1] Kilian Weinberger; Anirban Dasgupta; John Langford; Alex Smola; Josh Attenberg (2009). Feature Hashing\n",
      "     |      for Large Scale Multitask Learning. Proc. ICML.\n",
      "     |  \n",
      "     |  require_data(self, data_lock, new_start, done_index, hashing_parts, cols, process_index)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class HelmertEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  Helmert contrast coding for encoding categorical features.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has unknown categories.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has nan values.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = HelmertEncoder(cols=['CHAS', 'RAD'], handle_unknown='value', handle_missing='value').fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 21 columns):\n",
      "     |  intercept    506 non-null int64\n",
      "     |  CRIM         506 non-null float64\n",
      "     |  ZN           506 non-null float64\n",
      "     |  INDUS        506 non-null float64\n",
      "     |  CHAS_0       506 non-null float64\n",
      "     |  NOX          506 non-null float64\n",
      "     |  RM           506 non-null float64\n",
      "     |  AGE          506 non-null float64\n",
      "     |  DIS          506 non-null float64\n",
      "     |  RAD_0        506 non-null float64\n",
      "     |  RAD_1        506 non-null float64\n",
      "     |  RAD_2        506 non-null float64\n",
      "     |  RAD_3        506 non-null float64\n",
      "     |  RAD_4        506 non-null float64\n",
      "     |  RAD_5        506 non-null float64\n",
      "     |  RAD_6        506 non-null float64\n",
      "     |  RAD_7        506 non-null float64\n",
      "     |  TAX          506 non-null float64\n",
      "     |  PTRATIO      506 non-null float64\n",
      "     |  B            506 non-null float64\n",
      "     |  LSTAT        506 non-null float64\n",
      "     |  dtypes: float64(20), int64(1)\n",
      "     |  memory usage: 83.1 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Contrast Coding Systems for Categorical Variables, from\n",
      "     |  https://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/\n",
      "     |  \n",
      "     |  .. [2] Gregory Carey (2003). Coding Categorical Variables, from\n",
      "     |  http://psych.colorado.edu/~carey/Courses/PSYC5741/handouts/Coding%20Categorical%20Variables%202006-03-03.pdf\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      HelmertEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, mapping=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Static methods defined here:\n",
      "     |  \n",
      "     |  fit_helmert_coding(col, values, handle_missing, handle_unknown)\n",
      "     |  \n",
      "     |  helmert_coding(X_in, mapping)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class JamesSteinEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "     |  James-Stein estimator.\n",
      "     |  \n",
      "     |  For feature value `i`, James-Stein estimator returns a weighted average of:\n",
      "     |  \n",
      "     |      1. The mean target value for the observed feature value `i`.\n",
      "     |      2. The mean target value (regardless of the feature value).\n",
      "     |  \n",
      "     |  This can be written as::\n",
      "     |  \n",
      "     |      JS_i = (1-B)*mean(y_i) + B*mean(y)\n",
      "     |  \n",
      "     |  The question is, what should be the weight `B`?\n",
      "     |  If we put too much weight on the conditional mean value, we will overfit.\n",
      "     |  If we put too much weight on the global mean, we will underfit.\n",
      "     |  The canonical solution in machine learning is to perform cross-validation.\n",
      "     |  However, Charles Stein came with a closed-form solution to the problem.\n",
      "     |  The intuition is: If the estimate of `mean(y_i)` is unreliable (`y_i` has high variance),\n",
      "     |  we should put more weight on `mean(y)`. Stein put it into an equation as::\n",
      "     |  \n",
      "     |      B = var(y_i) / (var(y_i)+var(y))\n",
      "     |  \n",
      "     |  The only remaining issue is that we do not know `var(y)`, let alone `var(y_i)`.\n",
      "     |  Hence, we have to estimate the variances. But how can we reliably estimate the\n",
      "     |  variances, when we already struggle with the estimation of the mean values?!\n",
      "     |  There are multiple solutions:\n",
      "     |  \n",
      "     |      1. If we have the same count of observations for each feature value `i` and all\n",
      "     |      `y_i` are close to each other, we can pretend that all `var(y_i)` are identical.\n",
      "     |      This is called a pooled model.\n",
      "     |      2. If the observation counts are not equal, it makes sense to replace the variances\n",
      "     |      with squared standard errors, which penalize small observation counts::\n",
      "     |  \n",
      "     |          SE^2 = var(y)/count(y)\n",
      "     |  \n",
      "     |      This is called an independent model.\n",
      "     |  \n",
      "     |  James-Stein estimator has, however, one practical limitation - it was defined\n",
      "     |  only for normal distributions. If you want to apply it for binary classification,\n",
      "     |  which allows only values {0, 1}, it is better to first convert the mean target value\n",
      "     |  from the bound interval <0,1> into an unbounded interval by replacing mean(y)\n",
      "     |  with log-odds ratio::\n",
      "     |  \n",
      "     |      log-odds_ratio_i = log(mean(y_i)/mean(y_not_i))\n",
      "     |  \n",
      "     |  This is called binary model. The estimation of parameters of this model is, however,\n",
      "     |  tricky and sometimes it fails fatally. In these situations, it is better to use beta\n",
      "     |  model, which generally delivers slightly worse accuracy than binary model but does\n",
      "     |  not suffer from fatal failures.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop encoded columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_missing: str\n",
      "     |      options are 'return_nan', 'error' and 'value', defaults to 'value', which returns the prior probability.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'return_nan', 'error' and 'value', defaults to 'value', which returns the prior probability.\n",
      "     |  model: str\n",
      "     |      options are 'pooled', 'beta', 'binary' and 'independent', defaults to 'independent'.\n",
      "     |  randomized: bool,\n",
      "     |      adds normal (Gaussian) distribution noise into training data in order to decrease overfitting (testing data are untouched).\n",
      "     |  sigma: float\n",
      "     |      standard deviation (spread or \"width\") of the normal distribution.\n",
      "     |  \n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = JamesSteinEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 13 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS       506 non-null float64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD        506 non-null float64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(13)\n",
      "     |  memory usage: 51.5 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Parametric empirical Bayes inference: Theory and applications, equations 1.19 & 1.20, from\n",
      "     |  https://www.jstor.org/stable/2287098\n",
      "     |  \n",
      "     |  .. [2] Empirical Bayes for multiple sample sizes, from\n",
      "     |  http://chris-said.io/2017/05/03/empirical-bayes-for-multiple-sample-sizes/\n",
      "     |  \n",
      "     |  .. [3] Shrinkage Estimation of Log-odds Ratios for Comparing Mobility Tables, from\n",
      "     |  https://journals.sagepub.com/doi/abs/10.1177/0081175015570097\n",
      "     |  \n",
      "     |  .. [4] Stein's paradox and group rationality, from\n",
      "     |  http://www.philos.rug.nl/~romeyn/presentation/2017_romeijn_-_Paris_Stein.pdf\n",
      "     |  \n",
      "     |  .. [5] Stein's Paradox in Statistics, from\n",
      "     |  http://statweb.stanford.edu/~ckirby/brad/other/Article1977.pdf\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      JamesSteinEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      category_encoders.utils.TransformerWithTargetMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value', model='independent', random_state=None, randomized=False, sigma=0.05)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y, **kwargs)\n",
      "     |      Fit encoder according to X and binary y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Binary target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, y=None, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data. When the data are used for model training,\n",
      "     |      it is important to also pass the target in order to apply leave one out.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      y : array-like, shape = [n_samples] when transform by leave one out\n",
      "     |          None, when transform without target information (such as transform test set)\n",
      "     |      \n",
      "     |      \n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from category_encoders.utils.TransformerWithTargetMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Encoders that utilize the target must make sure that the training data are transformed with:\n",
      "     |           transform(X, y)\n",
      "     |      and not with:\n",
      "     |          transform(X)\n",
      "    \n",
      "    class LeaveOneOutEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "     |  Leave one out coding for categorical features.\n",
      "     |  \n",
      "     |  This is very similar to target encoding but excludes the current row's\n",
      "     |  target when calculating the mean target for a level to reduce the effect\n",
      "     |  of outliers.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan'  and 'value', defaults to 'value', which returns the target mean.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan' and 'value', defaults to 'value', which returns the target mean.\n",
      "     |  sigma: float\n",
      "     |      adds normal (Gaussian) distribution noise into training data in order to decrease overfitting (testing\n",
      "     |      data are untouched). Sigma gives the standard deviation (spread or \"width\") of the normal distribution.\n",
      "     |      The optimal value is commonly between 0.05 and 0.6. The default is to not add noise, but that leads\n",
      "     |      to significantly suboptimal results.\n",
      "     |  \n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = LeaveOneOutEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 13 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS       506 non-null float64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD        506 non-null float64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(13)\n",
      "     |  memory usage: 51.5 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Strategies to encode categorical variables with many categories, from\n",
      "     |  https://www.kaggle.com/c/caterpillar-tube-pricing/discussion/15748#143154.\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      LeaveOneOutEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      category_encoders.utils.TransformerWithTargetMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value', random_state=None, sigma=None)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  fit_column_map(self, series, y)\n",
      "     |  \n",
      "     |  fit_leave_one_out(self, X_in, y, cols=None)\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, y=None, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      y : array-like, shape = [n_samples] when transform by leave one out\n",
      "     |          None, when transform without target information (such as transform test set)\n",
      "     |      \n",
      "     |      \n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  transform_leave_one_out(self, X_in, y, mapping=None)\n",
      "     |      Leave one out encoding uses a single column of floats to represent the means of the target variables.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from category_encoders.utils.TransformerWithTargetMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Encoders that utilize the target must make sure that the training data are transformed with:\n",
      "     |           transform(X, y)\n",
      "     |      and not with:\n",
      "     |          transform(X)\n",
      "    \n",
      "    class MEstimateEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "     |  M-probability estimate of likelihood.\n",
      "     |  \n",
      "     |  This is a simplified version of target encoder, which goes under names like m-probability estimate or\n",
      "     |  additive smoothing with known incidence rates. In comparison to target encoder, m-probability estimate\n",
      "     |  has only one tunable parameter (`m`), while target encoder has two tunable parameters (`min_samples_leaf`\n",
      "     |  and `smoothing`).\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop encoded columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_missing: str\n",
      "     |      options are 'return_nan', 'error' and 'value', defaults to 'value', which returns the prior probability.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'return_nan', 'error' and 'value', defaults to 'value', which returns the prior probability.\n",
      "     |  randomized: bool,\n",
      "     |      adds normal (Gaussian) distribution noise into training data in order to decrease overfitting (testing data are untouched).\n",
      "     |  sigma: float\n",
      "     |      standard deviation (spread or \"width\") of the normal distribution.\n",
      "     |  m: float\n",
      "     |      this is the \"m\" in the m-probability estimate. Higher value of m results into stronger shrinking.\n",
      "     |      M is non-negative.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target > 22.5\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = MEstimateEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 13 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS       506 non-null float64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD        506 non-null float64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(13)\n",
      "     |  memory usage: 51.5 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems, equation 7, from\n",
      "     |  https://dl.acm.org/citation.cfm?id=507538\n",
      "     |  \n",
      "     |  .. [2] On estimating probabilities in tree pruning, equation 1, from\n",
      "     |  https://link.springer.com/chapter/10.1007/BFb0017010\n",
      "     |  \n",
      "     |  .. [3] Additive smoothing, from\n",
      "     |  https://en.wikipedia.org/wiki/Additive_smoothing#Generalized_to_the_case_of_known_incidence_rates\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      MEstimateEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      category_encoders.utils.TransformerWithTargetMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value', random_state=None, randomized=False, sigma=0.05, m=1.0)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y, **kwargs)\n",
      "     |      Fit encoder according to X and binary y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Binary target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, y=None, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      When the data are used for model training, it is important to also pass the target in order to apply leave one out.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      y : array-like, shape = [n_samples] when transform by leave one out\n",
      "     |          None, when transform without target information (such as transform test set)\n",
      "     |      \n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from category_encoders.utils.TransformerWithTargetMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Encoders that utilize the target must make sure that the training data are transformed with:\n",
      "     |           transform(X, y)\n",
      "     |      and not with:\n",
      "     |          transform(X)\n",
      "    \n",
      "    class OneHotEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  Onehot (or dummy) coding for categorical features, produces one feature per category, each binary.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  use_cat_names: bool\n",
      "     |      if True, category values will be included in the encoded column names. Since this can result in duplicate column names, duplicates are suffixed with '#' symbol until a unique name is generated.\n",
      "     |      If False, category indices will be used instead of the category values.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has unknown categories.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has nan values.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = OneHotEncoder(cols=['CHAS', 'RAD'], handle_unknown='indicator').fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 24 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS_1     506 non-null int64\n",
      "     |  CHAS_2     506 non-null int64\n",
      "     |  CHAS_-1    506 non-null int64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD_1      506 non-null int64\n",
      "     |  RAD_2      506 non-null int64\n",
      "     |  RAD_3      506 non-null int64\n",
      "     |  RAD_4      506 non-null int64\n",
      "     |  RAD_5      506 non-null int64\n",
      "     |  RAD_6      506 non-null int64\n",
      "     |  RAD_7      506 non-null int64\n",
      "     |  RAD_8      506 non-null int64\n",
      "     |  RAD_9      506 non-null int64\n",
      "     |  RAD_-1     506 non-null int64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(11), int64(13)\n",
      "     |  memory usage: 95.0 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Contrast Coding Systems for Categorical Variables, from\n",
      "     |  https://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/\n",
      "     |  \n",
      "     |  .. [2] Gregory Carey (2003). Coding Categorical Variables, from\n",
      "     |  http://psych.colorado.edu/~carey/Courses/PSYC5741/handouts/Coding%20Categorical%20Variables%202006-03-03.pdf\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      OneHotEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, drop_invariant=False, return_df=True, handle_missing='value', handle_unknown='value', use_cat_names=False)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  generate_mapping(self)\n",
      "     |  \n",
      "     |  get_dummies(self, X_in)\n",
      "     |      Convert numerical variable into dummy variables\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X_in: DataFrame\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      dummies : DataFrame\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  inverse_transform(self, X_in)\n",
      "     |      Perform the inverse transformation to encoded data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X_in : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      p: array, the same size of X_in\n",
      "     |  \n",
      "     |  reverse_dummies(self, X, mapping)\n",
      "     |      Convert dummy variable into numerical variables\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : DataFrame\n",
      "     |      mapping: list-like\n",
      "     |            Contains mappings of column to be transformed to it's new columns and value represented\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      numerical: DataFrame\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors defined here:\n",
      "     |  \n",
      "     |  category_mapping\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class OrdinalEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  Encodes categorical features as ordinal, in one ordered feature.\n",
      "     |  \n",
      "     |  Ordinal encoding uses a single column of integers to represent the classes. An optional mapping dict can be passed\n",
      "     |  in; in this case, we use the knowledge that there is some true order to the classes themselves. Otherwise, the classes\n",
      "     |  are assumed to have no true order and integers are selected at random.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  mapping: list of dicts\n",
      "     |      a mapping of class to label to use for the encoding, optional.\n",
      "     |      the dict contains the keys 'col' and 'mapping'.\n",
      "     |      the value of 'col' should be the feature name.\n",
      "     |      the value of 'mapping' should be a dictionary of 'original_label' to 'encoded_label'.\n",
      "     |      example mapping: [\n",
      "     |          {'col': 'col1', 'mapping': {None: 0, 'a': 1, 'b': 2}},\n",
      "     |          {'col': 'col2', 'mapping': {None: 0, 'x': 1, 'y': 2}}\n",
      "     |      ]\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan' and 'value', defaults to 'value', which will impute the category -1.\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan', and 'value, default to 'value', which treat nan as a category at fit time,\n",
      "     |      or -2 at transform time if nan is not a category during fit.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = OrdinalEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 13 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS       506 non-null int64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD        506 non-null int64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(11), int64(2)\n",
      "     |  memory usage: 51.5 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Contrast Coding Systems for Categorical Variables, from\n",
      "     |  https://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/\n",
      "     |  \n",
      "     |  .. [2] Gregory Carey (2003). Coding Categorical Variables, from\n",
      "     |  http://psych.colorado.edu/~carey/Courses/PSYC5741/handouts/Coding%20Categorical%20Variables%202006-03-03.pdf\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      OrdinalEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, mapping=None, cols=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  inverse_transform(self, X_in)\n",
      "     |      Perform the inverse transformation to encoded data. Will attempt best case reconstruction, which means\n",
      "     |      it will return nan for handle_missing and handle_unknown settings that break the bijection. We issue\n",
      "     |      warnings when some of those cases occur.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X_in : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      p: array, the same size of X_in\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Will use the mapping (if available) and the column list (if available, otherwise every column) to encode the\n",
      "     |      data ordinarily.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Static methods defined here:\n",
      "     |  \n",
      "     |  ordinal_encoding(X_in, mapping=None, cols=None, handle_unknown='value', handle_missing='value')\n",
      "     |      Ordinal encoding uses a single column of integers to represent the classes. An optional mapping dict can be passed\n",
      "     |      in, in this case we use the knowledge that there is some true order to the classes themselves. Otherwise, the classes\n",
      "     |      are assumed to have no true order and integers are selected at random.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors defined here:\n",
      "     |  \n",
      "     |  category_mapping\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class PolynomialEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  Polynomial contrast coding for the encoding of categorical features.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has unknown categories.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has nan values.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = PolynomialEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 21 columns):\n",
      "     |  intercept    506 non-null int64\n",
      "     |  CRIM         506 non-null float64\n",
      "     |  ZN           506 non-null float64\n",
      "     |  INDUS        506 non-null float64\n",
      "     |  CHAS_0       506 non-null float64\n",
      "     |  NOX          506 non-null float64\n",
      "     |  RM           506 non-null float64\n",
      "     |  AGE          506 non-null float64\n",
      "     |  DIS          506 non-null float64\n",
      "     |  RAD_0        506 non-null float64\n",
      "     |  RAD_1        506 non-null float64\n",
      "     |  RAD_2        506 non-null float64\n",
      "     |  RAD_3        506 non-null float64\n",
      "     |  RAD_4        506 non-null float64\n",
      "     |  RAD_5        506 non-null float64\n",
      "     |  RAD_6        506 non-null float64\n",
      "     |  RAD_7        506 non-null float64\n",
      "     |  TAX          506 non-null float64\n",
      "     |  PTRATIO      506 non-null float64\n",
      "     |  B            506 non-null float64\n",
      "     |  LSTAT        506 non-null float64\n",
      "     |  dtypes: float64(20), int64(1)\n",
      "     |  memory usage: 83.1 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Contrast Coding Systems for Categorical Variables, from\n",
      "     |  https://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/\n",
      "     |  \n",
      "     |  .. [2] Gregory Carey (2003). Coding Categorical Variables, from\n",
      "     |  http://psych.colorado.edu/~carey/Courses/PSYC5741/handouts/Coding%20Categorical%20Variables%202006-03-03.pdf\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      PolynomialEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, mapping=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Static methods defined here:\n",
      "     |  \n",
      "     |  fit_polynomial_coding(col, values, handle_missing, handle_unknown)\n",
      "     |  \n",
      "     |  polynomial_coding(X_in, mapping)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class SumEncoder(sklearn.base.BaseEstimator, sklearn.base.TransformerMixin)\n",
      "     |  Sum contrast coding for the encoding of categorical features.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has unknown categories.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan', 'value', and 'indicator'. The default is 'value'. Warning: if indicator is used,\n",
      "     |      an extra column will be added in if the transform matrix has nan values.  This can cause\n",
      "     |      unexpected changes in dimension in some cases.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = SumEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 21 columns):\n",
      "     |  intercept    506 non-null int64\n",
      "     |  CRIM         506 non-null float64\n",
      "     |  ZN           506 non-null float64\n",
      "     |  INDUS        506 non-null float64\n",
      "     |  CHAS_0       506 non-null float64\n",
      "     |  NOX          506 non-null float64\n",
      "     |  RM           506 non-null float64\n",
      "     |  AGE          506 non-null float64\n",
      "     |  DIS          506 non-null float64\n",
      "     |  RAD_0        506 non-null float64\n",
      "     |  RAD_1        506 non-null float64\n",
      "     |  RAD_2        506 non-null float64\n",
      "     |  RAD_3        506 non-null float64\n",
      "     |  RAD_4        506 non-null float64\n",
      "     |  RAD_5        506 non-null float64\n",
      "     |  RAD_6        506 non-null float64\n",
      "     |  RAD_7        506 non-null float64\n",
      "     |  TAX          506 non-null float64\n",
      "     |  PTRATIO      506 non-null float64\n",
      "     |  B            506 non-null float64\n",
      "     |  LSTAT        506 non-null float64\n",
      "     |  dtypes: float64(20), int64(1)\n",
      "     |  memory usage: 83.1 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Contrast Coding Systems for Categorical Variables, from\n",
      "     |  https://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/\n",
      "     |  \n",
      "     |  .. [2] Gregory Carey (2003). Coding Categorical Variables, from\n",
      "     |  http://psych.colorado.edu/~carey/Courses/PSYC5741/handouts/Coding%20Categorical%20Variables%202006-03-03.pdf\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      SumEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      sklearn.base.TransformerMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, mapping=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value')\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y=None, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Static methods defined here:\n",
      "     |  \n",
      "     |  fit_sum_coding(col, values, handle_missing, handle_unknown)\n",
      "     |  \n",
      "     |  sum_coding(X_in, mapping)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.TransformerMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Fit to data, then transform it.\n",
      "     |      \n",
      "     |      Fits transformer to X and y with optional parameters fit_params\n",
      "     |      and returns a transformed version of X.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : {array-like, sparse matrix, dataframe} of shape                 (n_samples, n_features)\n",
      "     |      \n",
      "     |      y : ndarray of shape (n_samples,), default=None\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      **fit_params : dict\n",
      "     |          Additional fit parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      X_new : ndarray array of shape (n_samples, n_features_new)\n",
      "     |          Transformed array.\n",
      "    \n",
      "    class TargetEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "     |  Target encoding for categorical features.\n",
      "     |  \n",
      "     |  For the case of categorical target: features are replaced with a blend of posterior probability of the target\n",
      "     |  given particular categorical value and the prior probability of the target over all the training data.\n",
      "     |  \n",
      "     |  For the case of continuous target: features are replaced with a blend of the expected value of the target\n",
      "     |  given particular categorical value and the expected value of the target over all the training data.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_missing: str\n",
      "     |      options are 'error', 'return_nan'  and 'value', defaults to 'value', which returns the target mean.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'error', 'return_nan' and 'value', defaults to 'value', which returns the target mean.\n",
      "     |  min_samples_leaf: int\n",
      "     |      minimum samples to take category average into account.\n",
      "     |  smoothing: float\n",
      "     |      smoothing effect to balance categorical average vs prior. Higher value means stronger regularization.\n",
      "     |      The value must be strictly bigger than 0.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = TargetEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 13 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS       506 non-null float64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD        506 non-null float64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(13)\n",
      "     |  memory usage: 51.5 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems, from\n",
      "     |  https://dl.acm.org/citation.cfm?id=507538\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      TargetEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      category_encoders.utils.TransformerWithTargetMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, drop_invariant=False, return_df=True, handle_missing='value', handle_unknown='value', min_samples_leaf=1, smoothing=1.0)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y, **kwargs)\n",
      "     |      Fit encoder according to X and y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  fit_target_encoding(self, X, y)\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  target_encode(self, X_in)\n",
      "     |  \n",
      "     |  transform(self, X, y=None, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      y : array-like, shape = [n_samples] when transform by leave one out\n",
      "     |          None, when transform without target info (such as transform test set)\n",
      "     |          \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from category_encoders.utils.TransformerWithTargetMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Encoders that utilize the target must make sure that the training data are transformed with:\n",
      "     |           transform(X, y)\n",
      "     |      and not with:\n",
      "     |          transform(X)\n",
      "    \n",
      "    class WOEEncoder(sklearn.base.BaseEstimator, category_encoders.utils.TransformerWithTargetMixin)\n",
      "     |  Weight of Evidence coding for categorical features.\n",
      "     |  \n",
      "     |  Parameters\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  verbose: int\n",
      "     |      integer indicating verbosity of the output. 0 for none.\n",
      "     |  cols: list\n",
      "     |      a list of columns to encode, if None, all string columns will be encoded.\n",
      "     |  drop_invariant: bool\n",
      "     |      boolean for whether or not to drop columns with 0 variance.\n",
      "     |  return_df: bool\n",
      "     |      boolean for whether to return a pandas DataFrame from transform (otherwise it will be a numpy array).\n",
      "     |  handle_missing: str\n",
      "     |      options are 'return_nan', 'error' and 'value', defaults to 'value', which will assume WOE=0.\n",
      "     |  handle_unknown: str\n",
      "     |      options are 'return_nan', 'error' and 'value', defaults to 'value', which will assume WOE=0.\n",
      "     |  randomized: bool,\n",
      "     |      adds normal (Gaussian) distribution noise into training data in order to decrease overfitting (testing data are untouched).\n",
      "     |  sigma: float\n",
      "     |      standard deviation (spread or \"width\") of the normal distribution.\n",
      "     |  regularization: float\n",
      "     |      the purpose of regularization is mostly to prevent division by zero.\n",
      "     |      When regularization is 0, you may encounter division by zero.\n",
      "     |  \n",
      "     |  Example\n",
      "     |  -------\n",
      "     |  >>> from category_encoders import *\n",
      "     |  >>> import pandas as pd\n",
      "     |  >>> from sklearn.datasets import load_boston\n",
      "     |  >>> bunch = load_boston()\n",
      "     |  >>> y = bunch.target > 22.5\n",
      "     |  >>> X = pd.DataFrame(bunch.data, columns=bunch.feature_names)\n",
      "     |  >>> enc = WOEEncoder(cols=['CHAS', 'RAD']).fit(X, y)\n",
      "     |  >>> numeric_dataset = enc.transform(X)\n",
      "     |  >>> print(numeric_dataset.info())\n",
      "     |  <class 'pandas.core.frame.DataFrame'>\n",
      "     |  RangeIndex: 506 entries, 0 to 505\n",
      "     |  Data columns (total 13 columns):\n",
      "     |  CRIM       506 non-null float64\n",
      "     |  ZN         506 non-null float64\n",
      "     |  INDUS      506 non-null float64\n",
      "     |  CHAS       506 non-null float64\n",
      "     |  NOX        506 non-null float64\n",
      "     |  RM         506 non-null float64\n",
      "     |  AGE        506 non-null float64\n",
      "     |  DIS        506 non-null float64\n",
      "     |  RAD        506 non-null float64\n",
      "     |  TAX        506 non-null float64\n",
      "     |  PTRATIO    506 non-null float64\n",
      "     |  B          506 non-null float64\n",
      "     |  LSTAT      506 non-null float64\n",
      "     |  dtypes: float64(13)\n",
      "     |  memory usage: 51.5 KB\n",
      "     |  None\n",
      "     |  \n",
      "     |  References\n",
      "     |  ----------\n",
      "     |  \n",
      "     |  .. [1] Weight of Evidence (WOE) and Information Value Explained, from\n",
      "     |  https://www.listendata.com/2015/03/weight-of-evidence-woe-and-information.html\n",
      "     |  \n",
      "     |  Method resolution order:\n",
      "     |      WOEEncoder\n",
      "     |      sklearn.base.BaseEstimator\n",
      "     |      category_encoders.utils.TransformerWithTargetMixin\n",
      "     |      builtins.object\n",
      "     |  \n",
      "     |  Methods defined here:\n",
      "     |  \n",
      "     |  __init__(self, verbose=0, cols=None, drop_invariant=False, return_df=True, handle_unknown='value', handle_missing='value', random_state=None, randomized=False, sigma=0.05, regularization=1.0)\n",
      "     |      Initialize self.  See help(type(self)) for accurate signature.\n",
      "     |  \n",
      "     |  fit(self, X, y, **kwargs)\n",
      "     |      Fit encoder according to X and binary y.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |          Training vectors, where n_samples is the number of samples\n",
      "     |          and n_features is the number of features.\n",
      "     |      y : array-like, shape = [n_samples]\n",
      "     |          Binary target values.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      self : encoder\n",
      "     |          Returns self.\n",
      "     |  \n",
      "     |  get_feature_names(self)\n",
      "     |      Returns the names of all transformed / added columns.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      feature_names: list\n",
      "     |          A list with all feature names transformed or added.\n",
      "     |          Note: potentially dropped features are not included!\n",
      "     |  \n",
      "     |  transform(self, X, y=None, override_return_df=False)\n",
      "     |      Perform the transformation to new categorical data. When the data are used for model training,\n",
      "     |      it is important to also pass the target in order to apply leave one out.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      \n",
      "     |      X : array-like, shape = [n_samples, n_features]\n",
      "     |      y : array-like, shape = [n_samples] when transform by leave one out\n",
      "     |          None, when transform without target information (such as transform test set)\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      \n",
      "     |      p : array, shape = [n_samples, n_numeric + N]\n",
      "     |          Transformed values with encoding applied.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __getstate__(self)\n",
      "     |  \n",
      "     |  __repr__(self, N_CHAR_MAX=700)\n",
      "     |      Return repr(self).\n",
      "     |  \n",
      "     |  __setstate__(self, state)\n",
      "     |  \n",
      "     |  get_params(self, deep=True)\n",
      "     |      Get parameters for this estimator.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      deep : bool, default=True\n",
      "     |          If True, will return the parameters for this estimator and\n",
      "     |          contained subobjects that are estimators.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      params : mapping of string to any\n",
      "     |          Parameter names mapped to their values.\n",
      "     |  \n",
      "     |  set_params(self, **params)\n",
      "     |      Set the parameters of this estimator.\n",
      "     |      \n",
      "     |      The method works on simple estimators as well as on nested objects\n",
      "     |      (such as pipelines). The latter have parameters of the form\n",
      "     |      ``<component>__<parameter>`` so that it's possible to update each\n",
      "     |      component of a nested object.\n",
      "     |      \n",
      "     |      Parameters\n",
      "     |      ----------\n",
      "     |      **params : dict\n",
      "     |          Estimator parameters.\n",
      "     |      \n",
      "     |      Returns\n",
      "     |      -------\n",
      "     |      self : object\n",
      "     |          Estimator instance.\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Data descriptors inherited from sklearn.base.BaseEstimator:\n",
      "     |  \n",
      "     |  __dict__\n",
      "     |      dictionary for instance variables (if defined)\n",
      "     |  \n",
      "     |  __weakref__\n",
      "     |      list of weak references to the object (if defined)\n",
      "     |  \n",
      "     |  ----------------------------------------------------------------------\n",
      "     |  Methods inherited from category_encoders.utils.TransformerWithTargetMixin:\n",
      "     |  \n",
      "     |  fit_transform(self, X, y=None, **fit_params)\n",
      "     |      Encoders that utilize the target must make sure that the training data are transformed with:\n",
      "     |           transform(X, y)\n",
      "     |      and not with:\n",
      "     |          transform(X)\n",
      "\n",
      "DATA\n",
      "    __all__ = ['BackwardDifferenceEncoder', 'BinaryEncoder', 'HashingEncod...\n",
      "\n",
      "VERSION\n",
      "    2.2.2\n",
      "\n",
      "AUTHOR\n",
      "    willmcginnis\n",
      "\n",
      "FILE\n",
      "    c:\\programdata\\anaconda3\\envs\\py36_b\\lib\\site-packages\\category_encoders\\__init__.py\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(ce)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "PY36-tf12",
   "language": "python",
   "name": "py36_b"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
